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 versionproject: Sets project nameadd_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 inproject()- 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 librarytarget_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 projecttarget_include_directories: Exposes header pathINTERFACE: 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 libraryfmt::fmt: Imported target provided by fmt- Automatically links include paths and libraries
This post is licensed under CC BY 4.0 by the author.