CMake는 C/C++ 프로젝트를 구성하고 빌드 시스템을 생성하는 데 사용하는 도구입니다.
다양한 플랫폼에서 프로젝트를 빌드하고 관리할 수 있도록 도와줍니다. CMake를 사용하는 주요 이유는 다음과 같습니다:
다음은 예시 프로젝트의 디렉토리 구조입니다:
MyProject/
├── CMakeLists.txt
├── src/
│ └── main.cpp
└── include/
└── myheader.h
cmake_minimum_required(VERSION 3.10)
project(MyProject)
# C++ 표준 설정
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 헤더 파일 포함 디렉토리 추가
include_directories(include)
# 소스 파일 설정
set(SOURCES src/main.cpp)
# 실행 파일 생성
add_executable(MyProject ${SOURCES})
CMakeLists.txt 파일을 작성하기 위한 문법을 이해하면, CMake를 사용하여 프로젝트를 쉽게 구성할 수 있습니다. 아래는 CMakeLists.txt 파일을 작성하는 데 필요한 주요 문법과 그 예시입니다.
cmake_minimum_required(VERSION <version>)
예시:
cmake_minimum_required(VERSION 3.10)
project(<project-name> [LANGUAGES <language>])
예시:
project(MyProject LANGUAGES CXX)
set(<variable> <value>)
예시:
set(CMAKE_CXX_STANDARD 11)
set(SOURCES src/main.cpp)
변수를 사용할 때는 ${}를 사용합니다.
예시:
add_executable(MyProject ${SOURCES})
include_directories(<dir1> [<dir2> ...])
예시:
include_directories(include)
set(SOURCES src/main.cpp src/other.cpp)
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL]
<source1> [source2 ...])
예시:
add_executable(MyProject ${SOURCES})
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL]
<source1> [source2 ...])
예시:
add_library(MyLibrary STATIC src/mylib.cpp)
target_link_libraries(<target> <lib1> [<lib2> ...])
예시:
target_link_libraries(MyProject MyLibrary)
if(<condition>)
<commands>
endif()
예시:
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
endif()
foreach(<var> <items>)
<commands>
endforeach()
예시:
foreach(SRC IN LISTS SOURCES)
message(STATUS "Source file: ${SRC}")
endforeach()
message([<mode>] "message to display")
예시:
message(STATUS "Configuring project")
find_package(<package> [version] [EXACT] [QUIET] [REQUIRED] [components...])
예시:
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(MyProject ${OpenCV_LIBS})
위에서 배운 문법을 종합하여, 간단한 프로젝트의 CMakeLists.txt 파일을 작성해보겠습니다.
cmake_minimum_required(VERSION 3.10)
project(MyProject LANGUAGES CXX)
# C++ 표준 설정
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 헤더 파일 포함 디렉토리 추가
include_directories(include)
# 소스 파일 설정
set(SOURCES src/main.cpp)
# 실행 파일 생성
add_executable(MyProject ${SOURCES})
# 패키지 찾기 예제 (필요한 경우)
# find_package(SomeLibrary REQUIRED)
# include_directories(${SomeLibrary_INCLUDE_DIRS})
# target_link_libraries(MyProject ${SomeLibrary_LIBS})
# 조건문 예제
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
endif()
# 메시지 출력
message(STATUS "Project configured successfully")
이 예제 파일은 프로젝트를 구성하고 빌드하는 데 필요한 기본적인 CMake 구문을 모두 포함하고 있습니다. CMakeLists.txt 파일을 작성할 때, 필요에 따라 이 예제를 확장하여 사용할 수 있습니다.
#include "myheader.h"
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
// 헤더 파일 내용 (필요에 따라 추가)
빌드 디렉토리 생성: 소스 파일이 있는 디렉토리와는 별도로 빌드 파일을 생성할 디렉토리를 만듭니다.
mkdir build
cd build
CMake 구성: CMakeLists.txt 파일을 기반으로 빌드 시스템을 생성합니다.
cmake ..
프로젝트 빌드: 생성된 빌드 파일을 사용하여 프로젝트를 빌드합니다.
cmake --build .
실행 파일 실행: 빌드된 실행 파일을 실행합니다.
./MyProject
위의 단계들을 통해 CMake를 사용하여 C++ 프로젝트를 구성하고 빌드할 수 있습니다.
CMake는 더 복잡한 프로젝트에서도 매우 유용하며, 다양한 추가 기능과 옵션을 제공합니다. 필요에 따라 공식 문서나 튜토리얼을 참고하여 더 많은 기능을 탐색할 수 있습니다.