[CMake] CMake 기본 개념
2025. 11. 30. 16:53
CMake는 빌드 도구가 아닙니다.
빌드 파일을 생성하는 프로그램입니다.
CMake 란?
CMake(Cross-platform Make)는 크로스 플랫폼 필드 시스템 생성기로
쉽게 말해, C/C++ 프로젝트를 빌드하기 위한 빌드 파일을 자동으로 만들어주는 도구입니다.
즉, CMake는 빌드를 직접하는 빌드 도구가 아니라 빌드 파일을 만들어주는 도구입니다. (◈ 이부분을 많이 헷갈려 합니다.)
(cmake 명령어를 쓰면 바로 실행파일이 나오지 않는 이유가 바로 이겁니다. cmake 명령어를 쓰더라도 이후 make 명령어와 같은 빌드 명령어를 따로 입력해야합니다.)
핵심 개념
1. CMake는 빌드 도구가 아닙니다.
CMake 자체는 코드를 컴파일하지 않습니다. 대신에 실제 빌드 도구가 사용할 파일을 생성합니다.
각 운영체제에서 생성하는 빌드 도구가 사용할 파일은 아래와 같습니다.
- Windows: Visual Studio 솔루션 파일 (.sln, .vcxproj)
- Linux/macOS: Makefile
- 기타: Ninja 빌드 파일, Xcode 프로젝트 등
즉, 이 CMake는 make빌드를 원하면 Makefile을 생성할 수 있고, Ninja빌드를 원하면 .ninja 빌드 파일을 만들어줍니다.
2. CMake파일이 필요한 이유
각 플랫폼마다 다른 빌드 시스템을 일일이 관리해야하는 문제가 있습니다.
문제 상황:
Windows에서 개발 --> Visual Studio 프로젝트 팡리
Linux에서 개발 --> Makefile
macOS에서 개발 --> Xcode 프로젝트
CMake의 해결책:
위의 문제 상황을 해결할 수 있는 이 CMake는 프로젝트 설정 파일(주로 CMakeLists.txt)을 읽어 각 플랫폼/IDE에 맞는 네이티브 빌드 파일을 생성해주는 역할을 합니다.
CMakeLists.txt (하나의 설정 파일)
↓
CMake 실행
↓
각 플랫폼에 맞는 빌드 파일 자동 생성
작동 방식
전체 흐름은 아래와 같습니다.
1. CMakeLists.txt 작성 (프로젝트 설정)
↓
2. cmake 명령 실행 (빌드 파일 생성)
↓
3. 생성된 빌드 파일로 실제 빌드
(make, msbuild, ninja 등 사용)
↓
4. 실행 파일/라이브러리 생성
간단한 예제
1단계: CMakeLists.txt 작성
cmake_minimum_required(VERSION 3.10)
project(MyApp)
add_executable(myapp main.cpp)
2단계: CMake 실행
mkdir build
cd build
cmake ..
3단계: 빌드 실행
# Linux/macOS 경우
make
# Windows (Visual Studio) 경우
msbuild MyApp.sln
# 또는 플랫폼 독립적으로
cmake --build .
CMake의 주요 기능
1. 플랫폼 독립성
하나의 CMakeLists.txt로 모든 플랫폼 지원 가능합니다.
CMakeLists.txt 파일 안에 if구문을 활용하여 각 플랫폼마다 설정을 다르게도 할 수 있습니다.
if(WIN32)
# Windows 전용 설정
elseif(UNIX)
# Linux/macOS 전용 설정
endif()
2. 의존성 관리
외부 라이브러리 자동 탐색 가능합니다.
find_package 명령어를 활용하여 외부 라이브러리에 대한 의존성을 관리할 수 있습니다.
find_package(OpenCV REQUIRED)
target_link_libraries(myapp ${OpenCV_LIBS})
3. 모듈화
복잡한 프로젝트를 서브디렉토리로 분할 가능합니다.
project/
├── CMakeLists.txt (루트)
├── lib/
│ └── CMakeLists.txt (라이브러리)
└── app/
└── CMakeLists.txt (실행 파일)
4. 빌드 구성 관리
Debug/Release 등 여러 빌드 타입 지원 가능합니다.
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake -DCMAKE_BUILD_TYPE=Release ..
간단한 비유
CMake는 건축 설계도면과 같습니다.
- CMakeLists.txt = 설계도면 (어떻게 지을지 기술)
- CMake = 설계사무소 (설계도를 시공 계획서로 변환)
- Makefile/프로젝트 파일 = 시공 계획서 (구체적인 작업 지시)
- Make/컴파일러 = 시공팀 (실제로 건물 건설)
- 실행 파일 = 완성된 건물
CMake의 장단점
장점
- 크로스 플랫폼: Windows, Linux, macOS 모두 지원
- 업계 표준: 대부분의 C/C++ 오픈소스 프로젝트가 사용
- 강력한 기능: 복잡한 의존성, 테스트, 설치 규칙 관리
- IDE 통합: Visual Studio, CLion, Qt Creator 등과 연동
단점
- 학습 곡선: 문법이 직관적이지 않음
- 디버깅 어려움: 빌드 설정 문제 해결이 까다로움
- 레거시 코드: 오래된 CMake 스크립트는 현대적 방식과 다름
실제 사용 사례
오픈소스 프로젝트들:
- OpenCV (컴퓨터 비전 라이브러리)
- LLVM/Clang (컴파일러)
- Qt (GUI 프레임워크)
- gRPC (RPC 프레임워크)
- TensorFlow (머신러닝)
이들 모두 CMake를 사용하여 다양한 플랫폼에서 빌드할 수 있습니다.
CMake vs 다른 빌드 도구
| Make | Unix 전통 빌드 도구, Makefile 직접 작성 | Linux 네이티브 빌드 |
| CMake | 플랫폼 독립적, 메타 빌드 시스템 | 크로스 플랫폼 프로젝트 |
| Ninja | 빠른 빌드 속도 | CMake와 함께 사용 |
| Meson | 현대적 빌드 시스템, Python 기반 | CMake 대안 |
| Bazel | Google의 빌드 도구, 대규모 프로젝트 | 거대 모노레포 |
참고 문서 링크
공식 문서:
- CMake 공식 문서: https://cmake.org/documentation/
- CMake Tutorial: https://cmake.org/cmake/help/latest/guide/tutorial/index.html
- CMake Commands Reference: https://cmake.org/cmake/help/latest/manual/cmake-commands.7.html
- CMake Variables: https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html
한국어 자료:
- Modern CMake 가이드: https://cliutils.gitlab.io/modern-cmake/
- CMake 예제 모음: https://github.com/ttroy50/cmake-examples
'CMake' 카테고리의 다른 글
| [CMake] Module(모듈) (0) | 2025.12.03 |
|---|---|
| [CMake] CMake 기본 예제 - 02 실행파일 생성 (헤더 파일 디렉토리 분리) (0) | 2025.11.30 |
| [CMake] CMake 기본 예제 - 01 실행파일 생성 (여러 소스파일 + C++ 표준 설정) (0) | 2025.11.30 |
