InJae Dev Blog

CMake Tutorial 01

|


My helpful screenshot

CMake란?

CMake(Cross Platform Make)란 CMake Script라는 언어로 make, ninja, MsBuild, OSX의 Makefile을 하나로 관리할수 있게해주는 툴입니다.

UNIX/LINUX -> CLANG, GCC, make, ninja  
Windows    -> Visual Studio(sln, vcproj)  
OSX        -> XCode(AppleClang)  

AppleClang은 C++표준을 제대로 준수하지 않아 쓰지않는것을 추천합니다.

CMake를 사용하는 이유

C++은 다른 Python, Ruby, Rust와는 다르게 OS별로 Complier와 Makefile이 다릅니다.
C++에서 멀티 플랫폼을 지원하는 라이브러리나 바이너리를 만들려면 OS별로 따로따로 Makefile을 작성해야됩니다. 플랫폼별로 하나하나 작성하는것은 효율적이지 못하고 작성하기도 힘듭니다.
그래서 Makefile을 하나의 파일로 작성을 하기 위해 여러가지 툴들이 나왔습니다.
그중 현재 C++에서 가장 인기있는 툴이 CMake입니다.

Cmake 설치

Ubuntu

sudo apt-get install cmake

OSX

brew install cmake

Windows

https://cmake.org/download/


CMake 사용법

간단히 설명하자면 Makefile작성하는것처럼 CMakeLists.txt 파일에 설정을 넣은뒤 사용하시면됩니다. CMake는 솔직히 말하자면 초심자가 사용하기에는 매우 불편합니다. 사용하려면 CMake의 동작방법과 cmake script를 알아야 하기때문에 제대로 사용하려면 꽤나 공부를 해야합니다.
간단히 CMake 기반 C++ 프로젝트의 가장 간단한 예를 보여드리겠습니다.

CMake도 사용법이 2가지로 나뉘는데 제가 사용하는 방식은
CMake에서 권장하는 Modern CMake 방식입니다.
예시는 리눅스를 기준으로 작성되었습니다.

바이너리 프로젝트 구조

CMakeLists.txt # CMake 설정파일
build/         # 빌드되는 폴더
include/       # public header 폴더
+-- example.h
src/           # .cpp 파일과 private header가 들어가는 폴더
+-- main.cpp

CMakeLists.txt

cmake_minimum_required(VERSION 3.6)

project(example LANGUAGES CXX VERSION 0.0.1)

# build될 target설정
add_executable(example "")
# target의 source 파일 지정
target_sources(example PRIVATE src/main.cpp)
# target가 사용할 header 지정
target_include_directories(example 
    PUBLIC  ${CMAKE_CURRENT_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
)
# target을 설치할수있게 해주는 설정
install(TARGETS example RUNTIME DESTINATION bin)

빌드 명령어

cmake -H. -Bbuild
cmake --build . --target install

빌드된 결과물

OS 별로 build파일의 구성이 다를수있습니다.

. build/
+-- CMakeCache.txt # CMake의 Cache파일
+-- CMakeFiles/    
+-- Makefile       # 생성된 Make파일 
+-- cmake_install.cmake # 바이너리의 설치를 정의해놓은 CMake파일
+-- install_mainfest.txt # 설치된 파일의 경로를 모아놓은 파일
+-- example              # build된 바이너리

Comments