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

  1. Why prefer target_link_libraries over global link_directories?
  2. How do you add public headers to a library?
Show answers
  1. It scopes dependencies to specific targets improving correctness and reuse.
  2. Use target_include_directories(util PUBLIC include).

Exercises

  1. Create a library and an app that links to it; add an include directory and verify compilation.
  2. Configure a Release and Debug build and compare binary sizes.