Я пытаюсь включить внешние библиотеки в проект cmake через ExternalProject_Add
, Чтобы опробовать эту функцию, я создал минимальный рабочий пример, включающий добавление pugixml в проект с ExternalProject_Add
, Однако у меня возникают проблемы с поиском способа добавления заголовочных файлов библиотеки из локальной установки внешнего проекта (т. Е. Заголовков pugixml) в путь включения проекта.
Дерево проекта минимального рабочего примера организовано следующим образом:
.
├── build
├── CMakeLists.txt
└── src
├── CMakeLists.txt
└── main.cpp
В этом дереве проекта build
ссылается на каталог сборки и путь, по которому вызывается cmake для генерации сборки.
Содержание ./CMakeLists.txt
являются следующими:
cmake_minimum_required(VERSION 3.0)
include(ExternalProject)
ExternalProject_Add(pugixml
GIT_REPOSITORY https://github.com/zeux/pugixml.git
INSTALL_DIR ${PROJECT_BINARY_DIR}/extern_install/pugixml
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
)
add_subdirectory(src)
В приведенном выше примере я добавил pugixml в качестве внешнего проекта, который должен быть установлен в двоичном каталоге проекта, файл которого будет использоваться исполняемым файлом, хранящимся в ./src
, Таким образом, содержание ./src/CMakeLists.txt
являются:
project(foo)
add_executable(foo main.cpp)
target_link_libraries(foo ${pugixml_LIBRARIES})
include_directories(${pugixml_INCLUDE_DIR}) # this part doesn't work
Это именно та часть, которая у меня возникла. Я предположил, что после добавления и установки внешнего проекта ExternalProject_Add
определил бы некоторые вспомогательные библиотеки, чтобы помочь ссылаться на файлы библиотеки и включать каталоги. Однако это не работает. Кто-нибудь знает, как правильно использовать ExternalProject_Add
включить внешние библиотеки?
К сожалению, это не будет работать вообще. Сборка внешнего проекта выполняется во время сборки, а не во время настройки / генерации CMake. Подсказка The ExternalProject_Add function creates a custom target to drive download, update/patch, configure, build, install and test steps of an external project:
(из CMake)
Следовательно, вам придется определить все переменные самостоятельно. Смотрите также: CMake — ссылка на библиотеку, загруженную из ExternalProject_add () (Я бы на самом деле пометил это как дубликат связанного вопроса, так как проблема та же)
Кстати, мне также не нравится, как это было сделано. Таким образом, нельзя просто использовать find_package
и т.п.
Предполагаемый способ использовать это «проект супер-сборки»: определить 1 CMakeLists, где у вас есть только ExternalProject_Add
s для всех зависимостей и вашего проекта. Тогда это будет работать с find_package
,
Других решений пока нет …