Мне нужно использовать мангровое дерево (Mongo ODM lib поверх mongo-c-driver и mongo-cxx-driver) и включить это в мой проект как CMake ExternalProject_Add
команда с зависимостями как mongo-c-driver / mongo-cxx-driver
# mongo-c-driver
ExternalProject_Add(mongo-c-driver
GIT_REPOSITORY https://github.com/mongodb/mongo-c-driver.git
GIT_TAG r1.12
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF
# CMAKE_ARGS -DINCLUDE_DIRECTORIES=${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0 ${EXTERNAL_INSTALL_LOCATION}/include/libmongoc-1.0
)
#include_directories(${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0
# ${EXTERNAL_INSTALL_LOCATION}/include/libmongoc-1.0)
#link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)
include_directories
команда здесь на самом деле не требуется, потому что файл конфигурации cmake mongoc делает эту работу. Впрочем, наверняка я тоже проверил с комментариями тоже.
Так что включения от mongo-c-driver требуются следующим включенным внешним проектом — мангровым лесом.
Что не удается из-за ошибки c ++, не найдены некоторые включаемые файлы, которые существуют во включаемых путях текущего проекта. Таким образом, кажется, что включенный внешний проект не использует текущие включения CMake, которые ранее были добавлены другим внешним проектом.
# mangrove
ExternalProject_Add(mangrove
GIT_REPOSITORY https://github.com/aospan/mangrove.git
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION} -DCMAKE_INCLUDE_DIRECTORIES_BEFORE=${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0
)
ExternalProject_Add_StepDependencies(mangrove build mongo-c-driver mongo-cxx-driver)
include_directories(${EXTERNAL_INSTALL_LOCATION}/include/libbson-1.0
${EXTERNAL_INSTALL_LOCATION}/include/libmongoc-1.0)
link_directories(${EXTERNAL_INSTALL_LOCATION}/lib)
Кажется, что include_directories
внутри скрипта не влияет на проект на основе CMake, включенный ExternalProject_Add
,
Есть ли способ передать эти включенные пути во внешний проект?
Вы используете неправильный макрос. CMAKE_INCLUDE_DIRECTORIES_BEFORE
только указывает на то, как include-directories
работа и является флаг.
Нет другого способа установить правильные переменные так, чтобы внешний CMakeLists.txt использовал find_path
заполнить путь к bson.h
, Если это не так, то я предлагаю вам патч CMakeLists.txt для использования find_path
и сделать запрос на получение.
Редактировать:
Кажется, что у мангрового проекта есть способ установить все это с ENABLE_BSON
, Вы можете установить BSON_VERSION
, BSON_INCLUDE_DIRS
а также BSON_LIBRARIES
вручную, если по умолчанию AUTO
не работает
Как указано в других ответах, вы не можете передать их во включенные mangrove
проект и что внешние проекты и текущий проект все независимы друг от друга.
Это кажется половиной проблемы. Похоже, вы пытаетесь использовать mongo-c-driver
предоставлять libbson
, Но mangrove
использует:
set(LIBBSON_REQUIRED_VERSION 1.7.0)
set(LIBBSON_REQUIRED_ABI_VERSION 1.0)
find_package(LibBSON ${LIBBSON_REQUIRED_VERSION} REQUIRED)
Что не совсем понятно, если find_package
работает в режиме модуля или конфигурации и каковы его результаты. Но для этого работают успешно libbson
должен быть построен, когда mongo-c-driver
построен так, что find_package
Можно найти библиотеку и настроить пути включения и линию связи.
Кажется, что mangrove
нашел то, что позволило find_package
не подвести, но не заселить ${LIBBSON_INCLUDE_DIRS}
с правильным путём включения, который вызвал упомянутую вами ошибку компиляции.
Без подробностей трудно дать вам подробный ответ, но вы должны убедиться, что find_package
команды в mangrove
правильно работают со встроенным и не установленным libbson
или установить libbson
в месте, совместимом с find_package
команда, используемая mangrove
,