CMake 가이드

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를 사용하면서 필요한 기능들을 추가로 학습하는 것이 좋은 방법이다.