CMake 기초: 멀티플랫폼 빌드 도구 입문

CMake 개요

C/C++ 개발자라면 한 번쯤 겪어봤을 것이다. 오픈소스 라이브러리를 직접 빌드하려 할 때, Visual Studio 버전 차이로 인해 무수한 오류에 마주치고, 결국 포기하는 경험. 이런 문제는 프로젝트의 확산에도 큰 장애물이 된다.

특히 크로스플랫폼 개발 환경에서는 더욱 심각하다. Windows에서 개발한 후 Ubuntu 서버로 배포할 때, 플랫폼별로 별도의 빌드 스크립트를 작성해야 하는 번거로움이 존재한다. CMake는 이러한 문제를 해결하기 위한 빌드 시스템 생성 도구다.

간단한 예제로 살펴보기

다음은 가장 기본적인 프로젝트 구조다.

demo_project/
  ├── CMakeLists.txt
  └── main.cpp

CMakeLists.txt 구성

# 최소 필요 CMake 버전 명시
cmake_minimum_required(VERSION 3.10)

# 프로젝트 식별자 설정
project(DemoApp VERSION 1.0 LANGUAGES CXX)

# 현재 디렉터리의 소스 파일을 목록으로 수집
file(GLOB_RECURSE SOURCES "src/*.cpp")

# 실행 파일 생성 규칙 정의
add_executable(${PROJECT_NAME} ${SOURCES})

main.cpp

#include <iostream>

int main() {
    std::cout << "CMake 빌드 성공!" << std::endl;
    return 0;
}

Visual Studio 프로젝트 생성

CMake를 실행할 때 Specify the generator for this project 단계에서 타겟 아키텍처를 주의 깊게 선택해야 한다. x86과 x64는 서로 다른 솔루션으로 분리하여 생성하는 것이 권장된다.

장단점 분석

한계점

  • 새로운 구문 체계에 대한 학습 필요
  • 파일 추가 시 IDE 대신 직접 CMakeLists.txt 수정 필요
  • file(GLOB...) 패턴은 헤더 파일 미포함으로 인텔리센스에 불리
  • 빌드 구성 변경 시 재생성 과정 필수

강점

  • 단일 설정으로 다양한 플랫폼의 빌드 환경 자동 생성
  • IDE 종속 설정 파일을 버전 관리에서 제외하여 저장소 깔끔화
  • CI/CD 파이프라인과의 높은 통합성

실무 활용 팁

헤더 파일을 명시적으로 나열하는 것이 GLOB 패턴보다 안정적이다. target_include_directories와 함께 사용하면 IDE에서도 원활한 코드 탐색이 가능하다.

cmake_minimum_required(VERSION 3.15)
project(AdvancedDemo)

set(HEADERS 
    include/utils.h
    include/config.h
)

set(CPP_FILES
    src/main.cpp
    src/utils.cpp
)

add_executable(${PROJECT_NAME} ${CPP_FILES} ${HEADERS})

target_include_directories(${PROJECT_NAME} 
    PRIVATE 
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

태그: cmake Build-System cross-platform Visual-Studio C++

6월 12일 17:42에 게시됨