Post

07. CMake Step-by-Step Guide

07. CMake Step-by-Step Guide

CMake Step-by-Step Guide (From Basic to External Libraries)


Prerequisites


1. Step-by-Step Guide

This post walks through 5 progressive stages of using CMake, starting from a minimal setup to modular projects and external dependencies.

2. Basic Executable

2-1. CMakeLists

1
2
3
4
cmake_minimum_required(VERSION 3.10)
project(myproject)

add_executable(myprogram main.cpp)

2-2. Project Structure

1
2
3
4
project/
├── CMakeLists.txt
├── main.cpp
└── build/

2-3. Explanation

  • cmake_minimum_required: Defines required CMake version
  • project: Sets project name
  • add_executable: Creates an executable target

3. Using PROJECT_NAME Variable

3-1. CMakeLists

1
2
3
4
cmake_minimum_required(VERSION 3.10)
project(myproject)

add_executable(${PROJECT_NAME} main.cpp)

3-2. Project Structure

1
2
3
4
project/
├── CMakeLists.txt
├── main.cpp
└── build/

3-3. Explanation

  • ${PROJECT_NAME} automatically uses the name defined in project()
  • Avoids hardcoding target names

4. Adding a Library

4-1. CMakeLists

1
2
3
4
5
6
7
8
cmake_minimum_required(VERSION 3.10)
project(myproject)

add_executable(${PROJECT_NAME} main.cpp)

add_library(mylib SHARED lib.cpp)

target_link_libraries(${PROJECT_NAME} mylib)

4-2. Project Structure

1
2
3
4
5
6
project/
├── CMakeLists.txt
├── lib.cpp
├── lib.h
├── main.cpp
└── build/

4-3. Explanation

  • add_library: Creates a shared library
  • target_link_libraries: Links library to executable

5. Using Subdirectories (Modular Structure)

5-1. Root CMakeLists

1
2
3
4
5
6
7
8
cmake_minimum_required(VERSION 3.10)
project(myproject)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} mylib)

add_subdirectory(lib)

5-2. lib/CMakeLists

1
2
3
add_library(mylib SHARED lib.cpp)

target_include_directories(mylib INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

5-3. Project Structure

1
2
3
4
5
6
7
8
project/
├── CMakeLists.txt
├── main.cpp
├── lib/
│   ├── lib.cpp
│   ├── lib.h
│   └── CMakeLists.txt
└── build/

5-4. Explanation

  • add_subdirectory: Includes another CMake project
  • target_include_directories: Exposes header path
  • INTERFACE: Consumers inherit include paths

6. Adding External Library

6-1. Root CMakeLists

1
2
3
4
5
6
7
8
9
10
cmake_minimum_required(VERSION 3.10)
project(myproject)

find_package(fmt REQUIRED)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} mylib fmt::fmt)

add_subdirectory(lib)

6-2. lib/CMakeLists

1
2
3
add_library(mylib SHARED lib.cpp)

target_include_directories(mylib INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

6-3. Project Structure

1
2
3
4
5
6
7
8
project/
├── CMakeLists.txt
├── main.cpp
├── lib/
│   ├── lib.cpp
│   ├── lib.h
│   └── CMakeLists.txt
└── build/

6-4. Explanation

  • find_package(fmt REQUIRED): Finds installed fmt library
  • fmt::fmt: Imported target provided by fmt
  • Automatically links include paths and libraries
This post is licensed under CC BY 4.0 by the author.