CMake란 무엇인가?
CMake는 크로스 플랫폼 빌드 시스템 생성 도구이다. C/C++ 프로젝트를 컴파일하기 위한 빌드 파일을 자동으로 생성한다.
C/C++ 프로젝트는 운영체제마다 다른 빌드 시스템을 사용한다:
- Windows: Visual Studio, MSVC
- Linux: Make, GCC
- macOS: Xcode, Clang
CMake는 하나의 설정 파일로 모든 플랫폼에서 동작하는 빌드 파일을 생성한다.
CMake의 핵심 개념
- CMakeLists.txt: 프로젝트의 빌드 설정을 정의하는 파일이다. 프로젝트 루트 디렉터리에 위치한다.
- 타겟(Target): 빌드할 대상을 의미한다. 실행 파일, 라이브러리 등이 타겟이 된다.
- 변수(Variables): 빌드 과정에서 사용되는 값들을 저장한다. 컴파일러 옵션, 파일 경로 등을 설정할 수 있다.
기본 사용법
1. 간단한 실행 파일 만들기
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyApp)
add_executable(myapp main.cpp)
이 예제는 main.cpp 파일을 컴파일하여 myapp 실행 파일을 생성한다.
2. 여러 소스 파일 사용하기
cmake_minimum_required(VERSION 3.10)
project(MyApp)
add_executable(myapp
main.cpp
utils.cpp
calculator.cpp
)
3. 헤더 파일 디렉터리 지정하기
cmake_minimum_required(VERSION 3.10)
project(MyApp)
# 헤더 파일 경로 추가
include_directories(include)
add_executable(myapp
src/main.cpp
src/utils.cpp
)
4. 라이브러리 생성하기
cmake_minimum_required(VERSION 3.10)
project(MyLibrary)
# 정적 라이브러리 생성
add_library(mylib STATIC
src/mylib.cpp
src/helper.cpp
)
# 헤더 파일 경로 설정
target_include_directories(mylib PUBLIC include)
5. 라이브러리 링크하기
cmake_minimum_required(VERSION 3.10)
project(MyApp)
# 라이브러리 생성
add_library(mylib STATIC src/mylib.cpp)
# 실행 파일 생성
add_executable(myapp src/main.cpp)
# 라이브러리 링크
target_link_libraries(myapp mylib)
실제 프로젝트 예제
다음은 실제 프로젝트 구조와 CMakeLists.txt 예제이다:
MyProject/
├── CMakeLists.txt
├── include/
│ └── calculator.h
├── src/
│ ├── main.cpp
│ └── calculator.cpp
└── build/
CMakeLists.txt 내용:
cmake_minimum_required(VERSION 3.10)
project(Calculator VERSION 1.0)
# C++ 표준 설정
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 헤더 파일 경로
include_directories(include)
# 소스 파일 목록
set(SOURCES
src/main.cpp
src/calculator.cpp
)
# 실행 파일 생성
add_executable(calculator ${SOURCES})
# 컴파일러 옵션 추가
target_compile_options(calculator PRIVATE -Wall -Wextra)
빌드 과정
1. 빌드 디렉터리 생성
mkdir build
cd build
2. CMake 실행 (빌드 파일 생성)
cmake ..
3. 실제 빌드
make # Linux/macOS
# 또는
cmake --build . # 모든 플랫폼
유용한 CMake 명령어
변수 설정
set(MY_VARIABLE "value")
set(SOURCE_FILES main.cpp utils.cpp)
조건부 컴파일
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
add_definitions(-DDEBUG)
endif()
외부 라이브러리 찾기
find_package(OpenCV REQUIRED)
target_link_libraries(myapp ${OpenCV_LIBS})
컴파일러 옵션 설정
target_compile_options(myapp PRIVATE -O2 -Wall)
주요 변수들
- CMAKE_CXX_STANDARD: C++ 표준 버전 (11, 14, 17, 20)
- CMAKE_BUILD_TYPE: 빌드 타입 (Debug, Release)
- CMAKE_INSTALL_PREFIX: 설치 경로
- PROJECT_SOURCE_DIR: 프로젝트 소스 디렉터리
마무리
CMake는 C/C++ 프로젝트의 빌드 과정을 단순화하고 플랫폼 독립적으로 만든다. 기본 개념을 이해하고 점진적으로 복잡한 기능을 활용하면 효율적인 빌드 시스템을 구축할 수 있다.
작은 프로젝트부터 시작하여 CMake의 다양한 기능을 익혀보자. 실제 프로젝트에서 CMake를 사용하면서 필요한 기능들을 추가로 학습하는 것이 좋은 방법이다.