大規模 C++ プロジェクトはほぼ CMake でビルドします。Makefile を書かず CMakeLists.txt を書くと、Linux/Mac/Windows の全環境で同じ設定が使えます。最小例から始めて target_link_libraries まで。
cmake_minimum_required(VERSION 3.16) project(hello LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(hello hello.cpp)
-S でソース、-B でビルドディレクトリ。ビルド成果物を別ディレクトリに隔離できるのが Makefile より強い点です。
add_executable(app main.cpp util.cpp server.cpp) target_include_directories(app PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) target_compile_options(app PRIVATE -Wall -Wextra -Wpedantic)
PRIVATE は「この target だけで使う」の意味。ライブラリで PUBLIC を指定すると依存先にも伝搬します。
add_library(mymath STATIC src/math.cpp src/vec.cpp) target_include_directories(mymath PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) add_executable(app src/main.cpp) target_link_libraries(app PRIVATE mymath)
STATIC は .a、SHARED は .so/.dylib/.dll。INTERFACE はヘッダオンリーライブラリ用。
| 指定 | 意味 |
|---|---|
| PRIVATE | この target のみで使う |
| INTERFACE | この target を使う人だけに渡す |
| PUBLIC | 両方(PRIVATE + INTERFACE) |
find_package(Boost 1.71 REQUIRED COMPONENTS system filesystem) target_link_libraries(app PRIVATE Boost::system Boost::filesystem)
include(FetchContent) FetchContent_Declare(fmt GIT_REPOSITORY https://github.com/fmtlib/fmt.git GIT_TAG 10.2.1) FetchContent_MakeAvailable(fmt) target_link_libraries(app PRIVATE fmt::fmt)
CMAKE_BUILD_TYPE は Debug/Release/RelWithDebInfo/MinSizeRel の 4 種。-g や -O2 などが自動で適用されます。
if(CMAKE_BUILD_TYPE STREQUAL "Debug") target_compile_options(app PRIVATE -fsanitize=address,undefined) target_link_options(app PRIVATE -fsanitize=address,undefined) endif()
| コマンド | 用途 |
|---|---|
cmake -S src -B build | configure |
cmake --build build -j 8 | 8 並列ビルド |
cmake --build build --target clean | クリーン |
cmake --install build --prefix /usr/local | インストール |
ctest --test-dir build | テスト実行 |
cmake -G Ninja ... | Ninja ジェネレータ(高速) |