CMake 기초 설정 및 사용법

1. CMake 개요

CMake는 크로스플랫폼에서 작동하는 빌드 시스템 생성 도구입니다. 기존의 make와 함께 사용되는 Makefile은 플랫폼에 따라 다르게 동작하며, 의존성 관리가 복잡하고 유지보수가 어렵습니다. 반면, CMake는 프로젝트의 빌드 로직을 정의한 후, 해당 환경에 맞는 Makefile이나 IDE 프로젝트 파일을 자동으로 생성합니다. 최종적으로는 make 명령어만으로 컴파일이 가능해집니다.

2. 간단한 프로젝트 구성

환경: Ubuntu 20.04

cmake --version

2.1 주석 사용법

  • 라인 주석: #를 사용합니다.
  • 블록 주석: [[]]를 사용하여 여러 줄의 주석을 작성할 수 있습니다.
# 이 파일은 CMakeLists.txt입니다.
#[[여기부터 시작되는 블록 주석입니다.
이 파일은 단순한 예제입니다.
끝입니다.]]
cmake_minimum_required(VERSION 3.0.0)

2.2 소스 파일과 빌드 설정

다음과 같은 소스 파일들이 존재합니다:

  • add.cpp, div.cpp, mult.cpp, sub.cpp, head.h
  • main.cpp는 메인 함수를 포함하고 있으며, 위의 함수들을 호출합니다.

CMakeLists.txt 예시:

cmake_minimum_required(VERSION 3.0.0)
project(CALC)

add_executable(app add.cpp div.cpp main.cpp mult.cpp sub.cpp)
  • cmake_minimum_required: 최소 요구 버전 지정 (옵션).
  • project: 프로젝트 이름을 정의하며, 언어, 버전, 설명 등도 설정 가능.
  • add_executable: 실행 파일을 생성합니다. 소스 파일 목록은 공백 또는 세미콜론으로 구분 가능.

2.3 빌드 프로세스

빌드 디렉터리를 따로 만들어 실행합니다:

mkdir build && cd build
cmake ..
make

이 과정을 통해 app 실행 파일이 생성됩니다.

3. 변수 정의: set 명령어 활용

반복적인 소스 파일 리스트를 관리하기 위해 set를 사용합니다.

set(SOURCES add.cpp;div.cpp;main.cpp;mult.cpp;sub.cpp)
add_executable(app ${SOURCES})

3.1 C++ 표준 지정

컴파일러에 -std=c++11 등의 옵션을 전달해야 하는 경우, CMake에서는 다음과 같이 설정합니다:

set(CMAKE_CXX_STANDARD 11)

또는 커맨드 라인에서 직접 전달:

cmake .. -DCMAKE_CXX_STANDARD=11

3.2 출력 경로 설정

실행 파일의 배치 경로를 지정하려면 EXECUTABLE_OUTPUT_PATH를 사용합니다:

set(EXECUTABLE_OUTPUT_PATH /home/dabing/aa/bb/cc)

경로는 절대 경로 권장이며, 하위 디렉터리가 없으면 자동 생성됩니다.

4. 소스 파일 자동 검색

수많은 소스 파일이 있는 프로젝트에서는 수동으로 나열하기 어려우므로, 자동 검색 기능을 활용합니다.

방법 1: aux_source_directory

aux_source_directory(${PROJECT_SOURCE_DIR} SOURCE_LIST)
add_executable(app ${SOURCE_LIST})

현재 프로젝트 폴더 내 모든 소스 파일을 자동으로 수집합니다.

방법 2: file(GLOB)

file(GLOB SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
add_executable(app ${SOURCE_FILES})

GLOB는 특정 패턴에 맞는 파일을 리스트로 가져오며, GLOB_RECURSE는 하위 폴더까지 재귀 검색합니다.

CMAKE_CURRENT_SOURCE_DIR는 현재 CMakeLists.txt가 위치한 경로를 의미합니다. 경로는 따옴표로 감싸거나 안 감싸도 됩니다.

태그: cmake build system cross-platform C++ standard variable

5월 27일 01:51에 게시됨