[기타잡학] CMake란?
CMake
[기타잡학] CMake란?
CMake
빌드
개발자가 소스 코드를 작성하고, 작성한 코드를 실행 가능한 프로그램으로 만들기 위해서는 빌드(Build)라는 일련의 과정을 거쳐야 한다.

빌드 과정을 나타낸 플로우차트
그러나 프로젝트 규모가 커지게 되면 빌드에 소요되는 시간이 늘어나고, 수많은 파일 간의 의존성 관리 문제 및 휴먼 에러가 발생할 위험이 높아지게 된다.
이를 방지하기 위해 도입된 것이 빌드 자동화 도구이다.
빌드 자동화 도구
빌드 자동화 도구는 수작업으로 진행되던 반복적인 빌드 과정을 스크립트나 설정 파일을 통해 자동으로 처리하여 개발 생산성을 높여주는 소프트웨어 프로그램으로, Make, Ant, Maven, Gradle 등이 대표적이다.

빌드 자동화 도구들
하지만 빌드 도구만으로 모든 문제가 해결되는 것은 아니다. 운영체제나 개발 환경에 따라 사용하는 빌드 도구와 설정 파일의 형식이 다르기 때문이다.
예를 들어 Linux 환경에서는 Makefile이나 Ninja 빌드 파일을 사용할 수 있고, Windows 환경에서는 Visual Studio 프로젝트 파일이나 MSBuild 설정을 사용하는 경우가 많다.
이 때 개발자가 각 환경에 맞는 빌드 설정 파일을 직접 작성한다면, 운영체제나 IDE가 바뀔 때마다 별도의 설정을 반복해서 관리해야 한다.
빌드 시스템 생성 도구
빌드 시스템 생성 도구는 이러한 문제를 해결하기 위해 사용된다. 개발자는 하나의 공통된 설정 파일에 프로젝트 구조, 소스 파일, 컴파일 옵션, 라이브러리 의존성 등을 작성하고, 빌드 시스템 생성 도구는 이를 바탕으로 각 개발 환경에 맞는 빌드 파일을 자동으로 생성한다.
이를 통해 개발자는 환경 별 빌드 설정을 직접 관리하는 부담을 줄일 수 있고, 동일한 프로젝트를 여러 플랫폼에서 더 일관되게 빌드할 수 있다.
또한 빌드 시스템 생성 도구는 프로젝트 내부의 모듈 간 관계를 명시하는 데에도 사용된다.
규모가 큰 프로젝트는 코드가 여러 계층이나 모듈로 나뉘는 경우가 많다. 이 때 빌드 시스템 생성 도구를 사용하면 각 모듈을 라이브러리나 실행 파일 단위로 정의하고, 어떤 모듈이 다른 모듈에 의존하는지 명확하게 표현할 수 있다. 이를 통해 프로젝트 구조를 체계적으로 관리하는 데 도움이 된다.
CMake

CMake
CMake는 C/C++ 프로젝트에서 자주 사용되는 빌드 시스템 생성 도구이다.
개발자가 CMakeLists.txt 파일에 프로젝트 구조, 소스 파일, 라이브러리 의존성, 컴파일 옵션 등을 작성하면 CMake는 이를 바탕으로 Makefile, Visual Studio 프로젝트 파일 등 각 개발 환경에 맞는 빌드 파일을 생성한다.
예제 코드
다음 예제 코드는 CppNetworkArena 프로젝트 초기에 사용한 CMake 예제 코드이다.
# CMake 최소 버전 설정
cmake_minimum_required (VERSION 3.20)
# CMake 프로젝트 정의
project(CppNetworkArena VERSION 0.1.0 LANGUAGES CXX)
# 프로젝트 전체 C++ 컴파일 기준 설정
# C++20 표준 사용
set(CMAKE_CXX_STANDARD 20)
# 지원되지 않을 경우 낮은 표준으로 대체하지 않고 오류 처리
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 컴파일러별 확장 방언 대신 ISO C++ 표준 모드 사용
set(CMAKE_CXX_EXTENSIONS OFF)
# Visual Studio에서 타깃을 논리적 폴더로 분류할 수 있도록 설정
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# -----------------------------------------------------------------
# Shared
# -----------------------------------------------------------------
# 서버-클라이언트 공용 헤더 전용 타깃 생성 (CppNetworkArenaShared)
# INTERFACE 타깃이므로 별도의 .lib 파일은 생성하지 않음
add_library(CppNetworkArenaShared INTERFACE)
# CppNetworkArenaShared를 사용하는 타깃에 공용 헤더 검색 경로를 전달
target_include_directories(CppNetworkArenaShared
INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/src/shared
)
# ------------------------------------------------------------------
# Server
# ------------------------------------------------------------------
# 서버 실행 파일 생성 (GameServer.exe)
add_executable(GameServer
src/server/main.cpp
)
# GameServer 타깃을 빌드할 때 CppNetworkArenaShared 타깃을 링크하도록 설정
target_link_libraries(GameServer
PRIVATE
CppNetworkArenaShared
)
# Visual Studio에서 GameServer 타깃이 Apps 폴더 아래에 표시되도록 설정
set_target_properties(GameServer PROPERTIES FOLDER "Apps")
# -------------------------------------------------------------------
# Client
# -------------------------------------------------------------------
# 클라이언트 실행 파일 생성 (GameClient.exe)
add_executable(GameClient
src/client/main.cpp
)
# GameClient 타깃을 빌드할 때 CppNetworkArenaShared 타깃을 링크하도록 설정
target_link_libraries(GameClient
PRIVATE
CppNetworkArenaShared
)
# Visual Studio에서 GameClient 타깃이 Apps 폴더 아래에 표시되도록 설정
set_target_properties(GameClient PROPERTIES FOLDER "Apps")
해당 코드를 통해 서버와 클라이언트를 독립적인 실행 파일로 관리하면서도, 공통으로 사용하는 설정은 하나의 공용 타깃을 통해 공유할 수 있다. 또한 각 타깃의 의존 관계가 CMake 코드에 명시되므로, 프로젝트의 구조와 모듈 간 관계를 쉽게 파악할 수 있다.
메타데이터
- post_id
- 2f938cbf892f
- slug
- 기타잡학-cmake란-2f938cbf892f
- url
- https://medium.com/@mangryang.dev/%EA%B8%B0%ED%83%80%EC%9E%A1%ED%95%99-cmake%EB%9E%80-2f938cbf892f
- canonical_url
- https://medium.com/@mangryang.dev/%EA%B8%B0%ED%83%80%EC%9E%A1%ED%95%99-cmake%EB%9E%80-2f938cbf892f
- author_url
- https://medium.com/@mangryang.dev
- status
- ok
- fetched_at
- 2026-06-23 03:48:11