Giao diện
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.cppBà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)