Руководство CMake. Шаг 3. Добавление требований к использованию библиотеки
Упражнение 1. Добавление требований к использованию библиотеки
Требования к использованию параметров цели обеспечивают гораздо лучший контроль над линковкой библиотеки или исполняемого файла и над строкой включения, а также дают больший контроль над транзитивностью свойств целей внутри CMake. Основные команды, которые используют требования к использованию:
target_compile_definitions()
target_compile_options()
target_include_directories()
target_link_directories()
target_link_options()
target_precompile_headers()
target_sources()
Цель
Добавить требования к использованию библиотеки.
Полезные материалы
Редактируемые файлы
- MathFunctions/CMakeLists.txt
- CMakeLists.txt
С чего начать
В этом упражнении мы выполним рефакторинг нашего кода из раздела «Добавление библиотеки», чтобы использовать современный подход CMake. Мы позволим нашей библиотеке определять свои собственные требования к использованию, чтобы они при необходимости транзитивно передавались другим целям. В этом случае MathFunctions
сама укажет все необходимые включаемые каталоги. Затем использующей её цели Tutorial
просто нужно выполнить линковку с MathFunctions
и не беспокоиться о каких-либо дополнительных каталогах включения.
Исходный код находится в каталоге Step3. В этом упражнении выполните задачи с TODO 1 по TODO 3.
Сначала добавьте вызов target_include_directories()
в MathFunctions/CMakeLists. Помните, что CMAKE_CURRENT_SOURCE_DIR
– это путь к каталогу исходников, который обрабатывается в данный момент.
Затем обновите (и упростите!) вызов target_include_directories()
в файле CMakeLists.txt верхнего уровня.
Сборка и запуск
Создайте новый каталог с именем Step3_build, запустите исполняемый файл cmake
или cmake-gui
, чтобы настроить проект, а затем соберите его с помощью выбранного инструмента сборки или с помощью cmake --build .
из каталога сборки. Вот напоминание о том, как это выглядит из командной строки:
mkdir Step3_build
cd Step3_build
cmake ../Step3
cmake --build .
Затем используйте только что созданное приложение Tutorial
и убедитесь, что оно работает правильно.
Решение
Давайте обновим код из предыдущего шага, чтобы использовать современный подход CMake к требованиям к использованию.
Мы хотим заявить, что любой, кто линкуется с MathFunctions
, должен включать текущий каталог исходников, а сама MathFunctions
этого не делает. Это может быть выражено требованием к использованию INTERFACE
. Помните, что INTERFACE
означает вещи, которые нужны потребителям, но не нужны создателю.
В конце MathFunctions/CMakeLists.txt используйте target_include_directories()
с ключевым словом INTERFACE
следующим образом:
TODO 1
MathFunctions/CMakeLists.txt
target_include_directories(MathFunctions
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)
Теперь, когда мы определили требования к использованию для MathFunctions
, мы можем безопасно удалить использование переменной EXTRA_INCLUDES
из CMakeLists.txt верхнего уровня, здесь:
TODO 2
CMakeLists.txt
if(USE_MYMATH)
add_subdirectory(MathFunctions)
list(APPEND EXTRA_LIBS MathFunctions)
endif()
И здесь:
TODO 3
CMakeLists.txt
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
)
Обратите внимание, что при использовании этого способа единственное, что делает наша исполняемая цель для использования нашей библиотеки, – это вызывает target_link_libraries()
с именем цели библиотеки. В более крупных проектах классический метод указания зависимостей библиотек вручную очень быстро усложняется.