Будет ли заголовок включаться явно при использовании find_package в CMake? - PullRequest
1 голос
/ 09 июля 2020

Когда я использую PyTorch для C ++, довольно легко просто использовать find_package для настройки зависимости. А вот CMakeLists.txt:

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(dcgan)

set(CMAKE_PREFIX_PATH /User/root/libtorch) # I added this line, does it effect?
find_package(Torch REQUIRED)

add_executable(dcgan dcgan.cpp)
target_link_libraries(dcgan "${TORCH_LIBRARIES}")
set_property(TARGET dcgan PROPERTY CXX_STANDARD 14)

Нет какой-либо явной команды для включения заголовка, но заголовок можно найти, если target_link_libraries(dcgan "${TORCH_LIBRARIES}") существует. Мне любопытно, почему файл заголовка можно найти, даже если нет target_include_directories(dcgan PUBLIC ${TORCH_INCLUDE_DIRS}).

Код находится на официальном сайте PyTorch, и он работает на MacOS и Linux. Что произошло.

ДОБАВИТЬ: Пакет находится в каталоге, о котором компилятор ничего не знает.

1 Ответ

2 голосов
/ 09 июля 2020

Путь включения может быть установлен как распространяемый параметр в зависимости:

target_link_libraries

Укажите библиотеки или флаги, которые будут использоваться при связывании данной цели и / или его иждивенцы. Будут распространяться требования к использованию из целевых объектов связанных библиотек. Требования к использованию зависимостей цели влияют на компиляцию ее собственных источников.

https://cmake.org/cmake/help/latest/command/target_link_libraries.html

Это означает, что target_link_libraries настроит цель. Он установит target_compile_features, target_compile_options, target_compile_directories, если они установлены как INTERFACE или PUBLIC в зависимости.

Например,

add_library(Lib ${SRCS_LIB})
target_include_directories(Lib INTERFACE ${DIRECTORY})

add_exectuable(Exe ${SRCS_EXE})
target_link_libraries(Exe PRIVATE Lib)

В этом Пример Exe унаследует подключаемые каталоги от Lib. Вам не нужно устанавливать их явно.

Так же работает Conan , например, Начало работы

 cmake_minimum_required(VERSION 2.8.12)
 project(MD5Encrypter)

 add_definitions("-std=c++11")

 include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
 conan_basic_setup()

 add_executable(md5 md5.cpp)
 target_link_libraries(md5 ${CONAN_LIBS})

и как это описано в Эффективный современный CMake

Используйте экспортированные целевые объекты внешних пакетов.

Не возвращайтесь к старому стилю использования CMake переменные, определенные внешними пакетами. Вместо этого используйте экспортированные цели через target_link_libraries.

Лучше всего не использовать target_include_directories для ваших зависимостей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...