Добавление зависимостей только для заголовков с CmakeC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Добавление зависимостей только для заголовков с Cmake

Сообщение Anonymous »

У меня есть простой проект, который требует трех библиотек только для заголовков для компиляции: websocketpp, spdlog и nlohmann /json. < /p>

Структура проекта выглядит так: < /p>

Код: Выделить всё

└── src
├── app
│   ├── CMakeLists.txt
│   ├── src
│   └── test
├── CMakeLists.txt
├── core
│   ├── CMakeLists.txt
│   ├── include
│   ├── src
│   └── test
└── vendor
├── install.cmake
├── nlohmann_json
├── spdlog
└── websocketpp
< /code>

root cmakelists.txt выглядит следующим образом: < /p>

cmake_minimum_required(VERSION 3.6.1 FATAL_ERROR)

..

# External 3rd party libs that we include

include(vendor/install.cmake)

add_subdirectory(core)
add_subdirectory(app)
Идея в основном заключается в том, что каждый подкаталог представляет собой библиотеку (например, Core ), и App «агрегирует» все из них. Каждая библиотека (например, Core ) создана так (

Код: Выделить всё

core/CMakeLists.txt< /code>): < /p>

project(foo-core VERSION 0.1 LANGUAGES CXX)
add_library(foo-core
src/foobar/foobar.cc
src/foobaz/baz.cc)

target_include_directories(foo-core PUBLIC
$
$
PRIVATE src)

target_link_libraries(foo-core websocketpp spdlog) # 

Обратите внимание, как я связываю зависимости (которые являются библиотеками только для заголовков!). Вот как я их приношу (vendor/install.cmake< /code>): < /p>

# spdlog

if((NOT SPDLOG_INCLUDE_DIR) OR (NOT EXISTS ${SPDLOG_INCLUDE_DIR}))
message("Unable to find spdlog, cloning...")

execute_process(COMMAND git submodule update --init -- vendor/spdlog
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

set(SPDLOG_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vendor/spdlog/include/
CACHE PATH "spdlog include directory")

install(DIRECTORY ${SPDLOG_INCLUDE_DIR}/spdlog DESTINATION include)

# Setup a target

add_library(spdlog INTERFACE)
target_include_directories(spdlog INTERFACE
$
$)

install(TARGETS spdlog EXPORT spdlog DESTINATION include)
endif()

# websocketpp

if((NOT WEBSOCKETPP_INCLUDE_DIR) OR (NOT EXISTS ${WEBSOCKETPP_INCLUDE_DIR}))
message("Unable to find websocketpp, cloning...")

execute_process(COMMAND git submodule update --init -- vendor/websocketpp
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

set(WEBSOCKETPP_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/vendor/websocketpp/
CACHE PATH "websocketpp include directory")

install(DIRECTORY ${WEBSOCKETPP_INCLUDE_DIR}/websocketpp DESTINATION include)

# Setup a target

add_library(websocketpp INTERFACE)
target_include_directories(websocketpp INTERFACE
$
$)

install(TARGETS websocketpp EXPORT websocketpp DESTINATION include)
endif()

# nlohmann/json

if((NOT NLOHMANN_JSON_INCLUDE_DIR) OR (NOT EXISTS ${NLOHMANN_JSON_INCLUDE_DIR}))
message("Unable to find nlohmann/json, cloning...")

execute_process(COMMAND git submodule update --init -- vendor/nlohmann_json
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

set(NLOHMANN_JSON_INCLUDE_DIR
${CMAKE_CURRENT_SOURCE_DIR}/vendor/nlohmann_json/src/
CACHE PATH "nlohmann/json include directory")

install(FILES ${NLOHMANN_JSON_INCLUDE_DIR}/json.hpp DESTINATION include)

# Setup a target

add_library(nlohmann_json INTERFACE )
target_include_directories(nlohmann_json INTERFACE
$
$)

install(TARGETS nlohmann_json EXPORT nlohmann_json DESTINATION include)
endif()
< /code>

Пока все хорошо: вы можете видеть, что зависимости извлекаются в качестве подмодулей GIT, что, к счастью, облегчает их управление.  Однако, когда я составляю свой проект с Mkdir Build && CD Build && Cmake ../ src < /code>, у меня есть следующие ошибки: < /p>


Cmake Error: instort (Export foocoreConfig ...) включает в себя Target
foo-co-co-co-co-core, который требует целевого веб-сокета, который не в яичке. />
Ошибка Cmake: install (export foocoreconfig ...) включает в себя Target
foo-core, который требует целевого spdlog, который не находится в наборе экспорта. #include  
или #include создает ошибку, говоря, что заголовок не найден. Это может быть что -то действительно простое, но я не могу понять, как это достичь. На самом деле, можно было бы просто пройти -я как флаг компилятора, чтобы использовать библиотеки, как я хочу, но абстракция Cmake, кажется, запутает меня. Я был бы очень рад, если бы кто -то мог объяснить, почему это не работает, и, надеюсь, как правильный способ включить эти библиотеки в мой проект. Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/413 ... with-cmake
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»