Руководство CMake. Шаг 3. Добавление требований к использованию библиотеки

Добавлено 6 апреля 2023 в 17:37
Руководство CMake. Шаг 3. Добавление требований к использованию библиотеки

Упражнение 1. Добавление требований к использованию библиотеки

Требования к использованию параметров цели обеспечивают гораздо лучший контроль над линковкой библиотеки или исполняемого файла и над строкой включения, а также дают больший контроль над транзитивностью свойств целей внутри CMake. Основные команды, которые используют требования к использованию:

Цель

Добавить требования к использованию библиотеки.

Полезные материалы

Редактируемые файлы

  • 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() с именем цели библиотеки. В более крупных проектах классический метод указания зависимостей библиотек вручную очень быстро усложняется.

Теги

C++ / CppCMakeАвтоматизация сборкиДинамическая библиотекаПрограммированиеСистема сборкиСтатическая библиотека

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.