Основы CMake
CMake — это кросс-платформенная система сборки, генерирующая файлы для ninja, make, Visual Studio и других.
▸Минимальный CMakeLists.txt
1cmake_minimum_required(VERSION 3.20)2project(MyApp VERSION 1.0 LANGUAGES CXX)34set(CMAKE_CXX_STANDARD 20)5set(CMAKE_CXX_STANDARD_REQUIRED ON)67add_executable(myapp main.cpp)
▸Добавление исходников
1add_executable(myapp2 src/main.cpp3 src/utils.cpp4 src/parser.cpp5)67target_include_directories(myapp PRIVATE include)8target_compile_options(myapp PRIVATE -Wall -Wextra -Werror)
Библиотеки
▸Статическая библиотека
1add_library(mylib STATIC2 src/lib.cpp3 src/helper.cpp4)56target_include_directories(mylib PUBLIC include)7target_compile_features(mylib PUBLIC cxx_std_20)
▸Динамическая библиотека
1add_library(mylib SHARED2 src/lib.cpp3)45set_target_properties(mylib PROPERTIES6 VERSION 1.0.07 SOVERSION 18)
Связывание
1add_executable(myapp main.cpp)2target_link_libraries(myapp PRIVATE mylib)
▸Системные зависимости
1find_package(Threads REQUIRED)2find_package(Boost REQUIRED COMPONENTS filesystem system)34target_link_libraries(myapp PRIVATE5 Threads::Threads6 Boost::filesystem7 Boost::system8)
Управление зависимостями
▸FetchContent (встроенный)
1include(FetchContent)23FetchContent_Declare(4 fmt5 GIT_REPOSITORY https://github.com/fmtlib/fmt.git6 GIT_TAG 10.1.17)8FetchContent_MakeAvailable(fmt)910target_link_libraries(myapp PRIVATE fmt::fmt)
▸Conan
1# conanfile.txt2[requires]3fmt/10.1.14nlohmann_json/3.11.256[generators]7CMakeDeps8CMakeToolchain910# Сборка11# conan install . --output-folder=build --build=missing12# cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=build/conan_toolchain.cmake
▸vcpkg
1# vcpkg.json2{3 "name": "myapp",4 "version-string": "1.0.0",5 "dependencies": ["fmt", "nlohmann-json"]6}78# Сборка9# cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=[vcpkg root]/scripts/buildsystems/vcpkg.cmake
Тестирование
1enable_testing()2find_package(GTest REQUIRED)34add_executable(tests test/test_main.cpp)5target_link_libraries(tests PRIVATE GTest::gtest_main mylib)67add_test(NAME MyAppTests COMMAND tests)
Установка
1install(TARGETS myapp mylib2 RUNTIME DESTINATION bin3 LIBRARY DESTINATION lib4 ARCHIVE DESTINATION lib5)67install(DIRECTORY include/ DESTINATION include)
Генерация конфигов
1# Генерация конфига для find_package2install(EXPORT mylibTargets3 FILE mylibTargets.cmake4 NAMESPACE mylib::5 DESTINATION lib/cmake/mylib6)
Заключение
CMake — это стандарт сборки в C++ экосистеме. Он поддерживает кросс-платформенную сборку, управление зависимостями и интеграцию с тестовыми фреймворками. Освоение CMake критично для работы с современными C++ проектами.