C++ - CMake Build System
Overview
Estimated time: 50–70 minutes
Use modern CMake to configure and build portable C++ projects. Learn targets, include/link, and simple module support.
Learning Objectives
- Write a minimal CMakeLists.txt for an executable and a library.
- Use target_include_directories and target_link_libraries correctly.
Prerequisites
Minimal CMake project
# CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(hello LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
add_executable(hello src/main.cpp)
Library + executable
# CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(app LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
add_library(util src/util.cpp include/util.h)
target_include_directories(util PUBLIC include)
add_executable(app src/main.cpp)
target_link_libraries(app PRIVATE util)
Build
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release
Common Pitfalls
- Using global include_directories/link_libraries; prefer target-specific commands.
- Forgetting to set CMAKE_CXX_STANDARD or per-target CXX_STANDARD.
Checks for Understanding
- Why prefer target_link_libraries over global link_directories?
- How do you add public headers to a library?
Show answers
- It scopes dependencies to specific targets improving correctness and reuse.
- Use target_include_directories(util PUBLIC include).
Exercises
- Create a library and an app that links to it; add an include directory and verify compilation.
- Configure a Release and Debug build and compare binary sizes.