Не удается корректно включить стороннюю библиотеку в CMake

#c #cmake

#c #cmake

Вопрос:

Кажется, я не могу правильно включить стороннюю библиотеку nlohman_json в свой проект на C . Ниже приведена моя попытка настройки CMake. Однако, когда я приступаю к построению, строка в верхней части моего parser.cpp который пытается включить #include «nlohmann/json.hpp», терпит неудачу, он говорит, что файл не может быть найден.

В CMakeLists.txt находится в корне папки проекта. Тогда есть src/engine/parser.cpp и включает в себя/nlohmann/json.hpp

 cmake_minimum_required(VERSION 3.10)

project(textadv)

set(JSON_BuildTests OFF CACHE INTERNAL "")

add_subdirectory(includes/nlohmann ${CMAKE_CURRENT_BINARY_DIR}/nlohmann_json)

add_executable(textadvexec src/engine/parser.cpp)
target_include_directories(textadvexec PRIVATE ${CMAKE_CURRENT_SOURCE_DIRECTORY}/includes)
set_target_properties(textadvexec PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(textadvexec PRIVATE nlohmann_json)
 

Комментарии:

1. Что у вас есть в includes/nlohmann каталоге? Я бы предположил, что у вас есть github.com/nlohmann/json проект здесь, так что вы включаете его в add_subdirectory себя. Но вы пишете, что у вас есть includes/nlohmann/json.hpp file, и это противоречит моему предположению: nlohmann_json проект не имеет json.hpp в своем корневом каталоге.

2. Если вы посмотрите в выпусках для этого проекта, кажется, что вы должны использовать только этот единственный файл .hpp.

3. Да, вы можете просто загрузить json.hpp , поместить ее в подкаталог nlohmann и настроить включаемые каталоги, чтобы #include <nlohmann/json.hpp> они работали. Включаемые каталоги настраиваются с include_directories target_include_directories помощью команд или. Но add_subdirecrtory команда, которую вы используете, делает совершенно разные вещи. Если вы хотите ее использовать, см. «Встроенный» вариант в их документации .

4. Я попытался закомментировать add_subdirectory, но никаких изменений не произошло. Учитывая мою структуру папок, я бы предположил, что именно так target_include_directories и должно быть использовано.

5. Пожалуйста, обновите свой вопросительный пост со структурой файлов в вашем проекте. Среди прочего, эта структура должна отражать содержимое includes подкаталога… И CMAKE_CURRENT_SOURCE_DIRECTORY является неправильным именем для переменной, которая содержит текущий каталог. Правильное имя — CMAKE_CURRENT_SOURCE_DIR .