Не удалось загрузить lohmann/json.hpp с помощью CMake — возникает фатальная ошибка: файл «nlohmann/json.hpp» не найден

У меня есть следующий main.cpp, очень простой скрипт, пытающийся воспроизвести проблему и изолировать ее от самой простой.

#include<iostream>

#include<fmt/core.h>

// #include "json/json.hpp"
// #include <json/json.hpp>
// #include <nlohmann/json.hpp>
// #include "json.hpp"
// #include "nlohmann/json.hpp"

int main(){
    fmt::print("Hello, world!\n");
    return 0;
}

Закомментированные операторы включения — это все пути, которые я пытался внедрить в свою программу.

Мой файл CMakeLists.txt выглядит так

cmake_minimum_required(VERSION 3.24)
project(main)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "-std=c++17")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build)

# include(FetchContent)
# FetchContent_Declare(
#   json
#   GIT_REPOSITORY https://github.com/nlohmann/json
# )
# FetchContent_MakeAvailable(json)

include(FetchContent)
FetchContent_Declare(fmt
    GIT_REPOSITORY https://github.com/fmtlib/fmt
    GIT_TAG 9.0.0
)
FetchContent_MakeAvailable(fmt)

add_executable(main main.cpp)
# target_link_libraries(main json)
target_link_libraries(main fmt)

Я закомментировал часть json, так как она явно не работает, я также могу json-src и json-build в моей папке _deps, поэтому я точно знаю, что она загружается на мою локальную машину.

После запуска cmake CMakeLists.txt и make, а затем запуска исполняемого файла я получаю сообщение об ошибке в заголовке 'nlohmann/json.hpp' file not found

Любая помощь будет оценена по достоинству.

Попытался воспроизвести пример с другим популярным пакетом C++, который работал нормально. Попытался изменить операторы включения, чтобы узнать, может быть, у меня что-то не так, так как я не полностью понимаю все нюансы с CMake и совсем новичок в этом.

Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
0
117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете специально использовать цель интерфейса, уже включенную в библиотеку nlohmann, которая автоматически заполнит правильный путь включения для вас:

target_link_libraries(main nlohmann_json::nlohmann_json)

Или вам нужно будет самостоятельно указать путь включения:

include_directories(${json_SOURCE_DIR}/include)

В любом случае вы сможете использовать #include <nlohmann/json.hpp> в своем источнике.

красиво, это работает! ... все еще немного сбит с толку, почему я должен делать это именно для этой библиотеки, а не для fmt или, может быть, eve googletest. Любая помощь будет оценена по достоинству.

dsj-23 20.11.2022 02:31

@ dsj-23 Для уверенности нужно просмотреть файл cmake, но я предполагаю, что {fmt} использует целевое имя fmt, поэтому вы можете просто target_link_libraries(main fmt). Если вы выбрали {fmt} как format, target_link_libraries(main format), вероятно, не сработает.

Ranoiaetep 20.11.2022 02:39

@ dsj-23 В общем, include_directories(${xxx_SOURCE_DIR}/include_path) всегда должен работать, так как FetchContent всегда будет генерировать xxx_SOURCE_DIR для вас, поэтому вы можете вручную добавить путь включения.

Ranoiaetep 20.11.2022 02:46

Другие вопросы по теме