Перейти к содержанию

Последнее обновление: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

Например:

-O0, -O1, -O2, -O3
Если используется llvm, можно обратиться сюда:

https://clang.llvm.org/docs/DiagnosticsReference.html

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.

Опции линковки GNU GCC

https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

По умолчанию линковщик 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

Похожие темы

Комментарии