#c #cmake #nlohmann-json
#c #cmake #nlohmann-json
Вопрос:
Я пытаюсь создать программу, которая использует nlohmann::json, но у меня проблема с включениями. В соответствии с инструкциями, которые я использую find_package(nlohmann_json 3.9.0 REQUIRED)
, и CMake найдет пакет, но при сборке я получаю сообщение об ошибке: fatal error: nlohmannjson.hpp: No such file or directory
Это результат CMake:
Found nlohmann_json: /usr/local/lib64/cmake/nlohmann_json/nlohmann_jsonConfig.cmake (found suitable version "3.9.1", minimum required is "3.9.0")
-- Configuring done
-- Generating done
-- Build files have been written to: /root/vts/build
И вот мой полный файл CMake
cmake_minimum_required(VERSION 3.10)
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
project(vitanza-service CXX)
add_subdirectory(VitanzaService)
add_executable(vts ${vts_SRC})
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
set_target_properties(vts PROPERTIES CXX_STANDARD 14)
set_target_properties(vts PROPERTIES CXX_STANDARD_REQUIRED ON)
LINK_DIRECTORIES(/usr/local/lib)
if (NOT WIN32)
add_compile_options(-Wall -Werror -pipe -fvisibility=hidden)
endif ()
set(CMAKE_CXX_FLAGS_PERFORMANCE "${CMAKE_CXX_FLAGS_RELEASE} -march=native")
if (CMAKE_COMPILER_IS_GNUCXX)
add_compile_options(-fno-strict-aliasing)
endif ()
find_package(AWSSDK REQUIRED COMPONENTS dynamodb)
find_package(MySQL REQUIRED)
find_package(Boost 1.53.0 REQUIRED COMPONENTS system)
find_package(nlohmann_json 3.9.0 REQUIRED)
include_directories(${Boost_INCLUDE_DIRS} ${MYSQL_INCLUDE_DIR})
target_link_libraries(vts PRIVATE
Boost::system
${AWSSDK_LINK_LIBRARIES}
${MYSQL_CLIENT_LIBS}
nlohmann_json::nlohmann_json
served libserved.so
)
Я не уверен, в чем проблема. Должен ли я добавить еще одну переменную include_directories
? Я даже попытался добавить путь к включаемому каталогу, но это тоже не сработало.
Я также попытался использовать add_path и добавить этот путь к include_directories:
find_path(JSON_INCLUDE_DIR nlohmann/json.hpp
/usr/local/include)
...
include_directories(${JSON_INCLUDE_DIR})
Наконец, я попытался использовать fetchContent, как описано здесь, но, похоже, ничего не работает.
Я использую CentOS 8, используя GCC 8 и последнюю версию nlohmann ::json (я создал ее из исходного кода, в том числе make install
). Только что попробовал это в Debian 10, и у меня такая же проблема.
Спасибо!
Комментарии:
1. Попробуйте использовать
make VERBOSE=1
, чтобы получить команды компилятора и посмотреть, какой путь включения (если таковой имеется) добавляется для nlohman2. Вы можете выполнить поиск в файле кэша переменных кэша, связанных с lib (
CMakeCache.txt
). Тот факт, чтоtarget_link_libraries
он не предоставляет вам доступ к необходимым заголовкам, указывает на одну из 2 вещей: либо пакет не предоставляет информацию о своих каталогах include, либо он хочет, чтобы вы использовали другой путь включения, например#include "json.hpp"
.3. Просто заметил одну вещь: во включаемом пути, указанном в выводе ошибки, есть обратная косая черта. Вы почти наверняка должны заменить эту обратную косую черту в инструкции include косой чертой. Linux не видит обратные косые черты в качестве разделителей путей…
4. @fabian вы абсолютно правы! Это была проблема. Я не могу поверить, что я боролся с этим в течение двух дней. Спасибо! Напишите ответ на этот вопрос, чтобы я мог принять его как ответ 🙂