Последнее обновление:2026-10-12
CMake: введение и практика¶
Обязательные основы CMake, часть 1¶
1. Установка флагов компилятора¶
Например: задать стандарт C++, включить все предупреждения.
set(CMAKE_CXX_FLAGS "-std=c++0x -Wall")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -Wall")
add_compile_options("$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,CXX>:-std=c++11>")
Официальные материалы: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Например:
Если используется llvm, можно обратиться сюда:2. Установка свойств исходных файлов¶
Это одно из сложных свойств CMake: если целей несколько, может понадобиться изменить поведение отдельной цели. Например, если нужно собрать main.cpp под C++11, а для библиотеки — собрать её под C++14, можно воспользоваться командой set_source_files_properties, чтобы настроить свойства конкретных исходных файлов, как показано ниже:
cmakeCopy code
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/*.cpp PROPERTIES COMPILE_FLAGS "-std=c++11")
https://cmake.org/cmake/help/v3.3/manual/cmake-properties.7.html#source-file-properties
3. Флаги линковщика¶
Ниже приведён список флагов линковщика GNU GCC.
По умолчанию линковщик GCC может искать в каталогах, заданных в переменных окружения (/usr/lib;/usr/local/lib), а затем линкует стандартные библиотеки.
Один из самых распространённых флагов — -l, используемый для линковки нужных библиотек, например -lzlib, -lboost и т.д.
Есть и другие дополнительные флаги, помогающие изменить поведение опций линковки исполняемого файла.
Вот переменные, в которые можно добавлять флаги линковщика:
CMAKE_EXE_LINKER_FLAGS: флаги, используемые линковщиком при создании исполняемого файлаCMAKE_EXE_LINKER_FLAGS_RELEASE: флаги, используемые линковщиком при создании release-версии исполняемого файлаCMAKE_EXE_LINKER_FLAGS_DEBUG: флаги, используемые линковщиком при создании debug-версии исполняемого файлаCMAKE_STATIC_LINKER_FLAGS: флаги, используемые линковщиком при создании статической библиотеки (.a, .lib)CMAKE_SHARED_LINKER_FLAGS: флаги, используемые линковщиком при создании разделяемой библиотеки (.so, .dll)CMAKE_MODULE_LINKER_FLAGS: флаги, используемые линковщиком при создании модульной библиотеки
Например, добавить флаги линковщика можно следующим кодом:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl")
4. Пакеты Debug и Release¶
Внутри файла CMakeLists.txt доступна переменная CMAKE_BUILD_TYPE. Тип сборки легко проверить прямо в CMakeLists.txt:
if(${CMAKE_BUILD_TYPE} MATCHES Debug)
message("Debug Build")
elseif(${CMAKE_BUILD_TYPE} MATCHES Release)
message("Release Build")
endif()
- CMAKE_EXE_LINKER_FLAGS_RELEASE: флаги для создания release-версии исполняемого файла
- CMAKE_EXE_LINKER_FLAGS_DEBUG: флаги для создания debug-версии исполняемого файла
- CMAKE_CXX_FLAGS_RELEASE
- CMAKE_CXX_FLAGS_DEBUG
Похожие темы¶
- Сборка проектов C++ с Bazel | C++那些事
- Совместная отладка Bazel и LLDB | C++那些事
- Введение в управление пакетами Conan для C++ | C++那些事
- C++ Insights: взгляд на этап компиляции | C++那些事
- Интерактивные C++ Jupyter Notebook | C++那些事
- Преобразование C++ string в int | C++那些事
- Отладочный макрос dbg-macro для C++ | C++那些事
- Подробный разбор опций компиляции GCC | C++那些事
- Отладка программ на C++ с помощью GDB | C++那些事
- Расширенная отладка с помощью GDB Python | C++那些事