CMake поддерживает следующие команды для добавления настроек к цели:
target_compile_definitions
— добавляет определения,target_compile_options
— добавляет опции компилятора,target_include_directories
— добавляет пути поиска заголовочных файлов,target_link_libraries
— добавляет линкуемые библиотеки.
Эти команды принимают имя цели в качестве первого аргумента. Цели создаются командами add_executable
и add_library
. Для add_executable
целью является исполняемый файл, а для add_library
— библиотека (статическая или динамическая).
CMake поддерживает следующие команды для добавления глобальных настроек:
add_compile_definitions
— добавляет определения,add_compile_options
— добавляет опции компилятора,include_directories
— добавляет пути поиска заголовочных файлов.link_libraries
— добавляет линкуемые библиотеки.
Эти настройки применяются к целям в текущей папке и всех вложенных папках.
Команды для настройки целей и глобальные команды очень похожи, но имеют разную область видимости. К сожалению, нет аналогичных команд для настройки исходных файлов.
Чтобы добавить настройки к исходному файлу, можно воспользоваться командой set_property
или set_source_files_properties
. Пример использования:
set_property(SOURCE LibPQExt.cpp PROPERTY INCLUDE_DIRECTORIES
${CMAKE_SOURCE_DIR}/libs/postgresql-9.6/src/include
)
set_property
позволяет добавлять настройки для нескольких исходных файлов одновременно.
Более удобный способ — создать из исходного файла или их набора специальную цель, которая называется объектной библиотекой.
Синтаксис команды для создания объектных библиотек:
add_library(<name> OBJECT <src>...)
К такой цели можно применять команды с префиксом target_
. Например, можно добавить определение LOGGER_TYPE=3
только для файла logger.cpp
. Делается это следующим образом
add_library(logger OBJECT logger.cpp)
target_compile_definitions(logger PUBLIC LOGGER_TYPE=3)
Объектную библиотеку можно добавить к другим целям как набор исходных файлов. Для этого в команды add_executable
или add_library
надо добавить выражение $<TARGET_OBJECTS:objlib>
, где objlib
— имя объектной библиотеки. Например:
add_library(logger OBJECT logger.cpp)
target_compile_definitions(logger PUBLIC LOGGER_TYPE=3)
add_executable(my_application
main.cpp
archiver.cpp
$<TARGET_OBJECTS:logger>
)
Поддержка объектных библиотек была введена в CMake версии 2.8.8 (апрель 2012 года). При использовании объектных библиотек рекомендуется в файле CMakeLists.txt ограничить версию CMake на уровне 2.8.8 или выше:
cmake_minimum_required(VERSION 2.8.8)