Skip to content

CMake Project Setup

🎯 Mục tiêu

🎯 Sau bài thực hành này, bạn sẽ:

  • Viết CMakeLists.txt chuẩn cho C++ project
  • Tạo library targets và link dependencies
  • Cấu hình build types (Debug/Release)
  • Thiết lập CTest cho automated testing

Mô tả bài tập

CMake là build system tiêu chuẩn của C++ hiện đại. Bài tập hướng dẫn từ project đơn giản đến multi-target với testing.

Yêu cầu

Bài 1: CMakeLists.txt cơ bản

cmake
cmake_minimum_required(VERSION 3.20)
project(MyCalculator VERSION 1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# TODO: add_executable từ src/main.cpp
# TODO: target_include_directories cho include/

Bài 2: Library Target & Linking

Tách Calculator thành static library.

cmake
# lib/CMakeLists.txt
add_library(calculator STATIC calculator.cpp)
target_include_directories(calculator PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

# Root CMakeLists.txt
add_subdirectory(lib)
add_executable(app src/main.cpp)
target_link_libraries(app PRIVATE calculator)

Yêu cầu: Phân biệt PUBLIC, PRIVATE, INTERFACE trong target_link_libraries.

Cấu trúc thư mục:

my-project/
├── CMakeLists.txt
├── src/
│   └── main.cpp
├── lib/
│   ├── CMakeLists.txt
│   ├── calculator.cpp
│   └── calculator.h
└── tests/
    ├── CMakeLists.txt
    └── test_calculator.cpp

Bài 3: Testing với CTest + Google Test

cmake
# tests/CMakeLists.txt
include(FetchContent)
FetchContent_Declare(googletest
    GIT_REPOSITORY https://github.com/google/googletest.git
    GIT_TAG v1.14.0)
FetchContent_MakeAvailable(googletest)

add_executable(calculator_tests test_calculator.cpp)
target_link_libraries(calculator_tests PRIVATE calculator GTest::gtest_main)
include(GoogleTest)
gtest_discover_tests(calculator_tests)

Gợi ý

Gợi ý Bài 2

PUBLIC = cả library và consumers thấy. PRIVATE = chỉ library. INTERFACE = chỉ consumers.

Gợi ý Bài 3

FetchContent tải GTest lúc configure. Chạy tests: cmake --build . && ctest --output-on-failure.

Lời giải tham khảo

Xem lời giải
cmake
# Root CMakeLists.txt hoàn chỉnh
cmake_minimum_required(VERSION 3.20)
project(MyCalculator VERSION 1.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

add_subdirectory(lib)
add_executable(app src/main.cpp)
target_link_libraries(app PRIVATE calculator)

enable_testing()
add_subdirectory(tests)