Blog
개발중인 미완성 페이지로, 일부 기능이 동작하지 않을 수 있습니다.

CMake에 관심 없는 사람을 위한, 초간단 CMake 가이드

2024. 6. 19.|2024. 10. 6.

CMake를 별로 알고싶지 않은 사람을 위한, 최소한만 다루는 CMake 가이드이다.

목차

기본 개념

CMake 자체는 빌드 시스템이라기보다는 빌드 시스템을 위한 빌드 시스템이다.

CMake만 가지고는 빌드에 써먹을 수 없고, make나 Visual Studio Build Tools (Visual Studio에 내장), 또는 Ninja나 Meson 등 별개의 빌드시스템이 필요하다.

cli 프로그램으로, 이름은 cmake이고, 설정 파일로는 CMakeLists.txt를 사용한다.
사실 GUI도 있긴 하지만 거의 사용하지 않는다.

빌드 방법

우선 빌드할 때 생기는 임시 파일이나 빌드 설정 등이 들어갈 빌드 폴더가 필요하다.

빌드 폴더에 가서 cmake (CMakeLists.txt가 있는 폴더 경로)를 실행하거나, CMakeLists.txt가 있는 폴더에서 cmake -B (빌드 폴더 경로)를 실행해 빌드 폴더를 만들 수 있다.
또는 아무데서나 cmake -B (빌드 폴더 경로) (CMakeLists.txt가 있는 폴더 경로)를 실행해도 되긴 한다.

git clone /path/to/repository repository
cd repository

cmake -B builddir
# 또는
mkdir builddir && (cd builddir && cmake ..)

그렇게 빌드 폴더를 만들고 나면 cmake --build (빌드 폴더 경로)로 빌드할 수 있다.

예시

src/main.c
#include <stdio.h>

int main() {
  puts("Hello world!");
  return 0;
}
src/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(HelloWorld)
add_executable(hello main.c)

이런 파일이 있다고 하자.

cmake -B builddir src
cmake --build builddir

# 또는

mkdir builddir
cd builddir
cmake ../src
cmake --build .

이런 명령어를 실행하면 hello.exe가 생긴 것을 확인할 수 있다.

hello.exe가 생긴 모습

어떤 빌드시스템을 사용했는지에 따라 출력 위치는 다를 수 있다. 내 경우에는 Visual Studio Build Tools를 사용했다.

CMakeLists.txt

CMakeLists.txt 파일에서 프로젝트의 이름을 정의하고, 소스 파일과 라이브러리를 추가하며, 대상(실행 파일이나 라이브러리)을 설정할 수 있다.

함수 호출처럼 생긴 명령어들로 이루어져 있다.

cmake_minimum_required(VERSION 3.10) # CMake 최소 버전 지정
project(MyProject) # 프로젝트 이름

# 대상 실행 파일 추가 (소스코드 지정)
add_executable(myapp main.cpp sub.cpp)

# 라이브러리 링크
target_link_libraries(myapp mylib)

주요 CMake 명령어

  • cmake_minimum_required(VERSION): 필요한 CMake의 최소 버전을 지정 (필수)
  • project(name): 프로젝트의 이름을 정의 (필수)
  • add_executable(name source1 source2 ...): 실행 파일 생성
  • add_library(name STATIC source1 source2 ...): 정적 라이브러리 생성
  • add_library(name SHARED source1 source2 ...): 동적 라이브러리 생성
  • target_link_libraries(target lib1 lib2 ...): 특정 대상에 라이브러리를 연결
  • include_directories(dir1 dir2 ...): 헤더 include 디렉터리 추가

마무리

일단 CMake는 크로스 플랫폼 빌드를 위한 것이지만, 크로스 플랫폼을 고려하지 않더라도 좋은 빌드 시스템이다.

C나 C++을 쓴다면 꼭 써 보는 것을 권장한다.

C
C++
CMake

Comments