Как правильно настроить файл cmake, чтобы создать простой hello world для nlohmann_ json? - PullRequest
1 голос
/ 09 марта 2020

Я использую следующий JSON синтаксический анализатор: https://github.com/nlohmann/json

Ниже приведены шаги, которые я выполнил для сборки:

 2074  git clone https://github.com/nlohmann/json.git
 2075  git branch
 2076  ls
 2077  cd json/
 2078  git branch
 2079  git pull
 2080  ls
 2081  vi CODE_OF_CONDUCT.md 
 2082  mkdir build
 2083  cd build/
 2084  ls
 2085  cmake ..
 2086  cmake --build .
 2087  ctest --output-on-failure

Пройдены модульные тесты , Я не вижу, как создается библиотека, как упоминается в документации.

Я пытаюсь создать простую программу hello world для парсера. Вот код:

#include <nlohmann/json.hpp>
#include<string.h>
// for convenience
using json = nlohmann::json;

int
main(int argc, char *argv[])
{
    std::ifstream ifs("test.json");
    json jf = json::parse(ifs);
     return 0;
}

И файл CMake:

# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)

# set the project name
project(my_json CXX)
find_package(nlohmann_json 3.2.0 REQUIRED)

Однако CMake не может найти пакет nlohmann_ json.

Пожалуйста, предложите, как построить этот пример. Я планирую использовать метод внешней библиотеки для создания этого кода.

1 Ответ

0 голосов
/ 10 марта 2020

Подход к пакету

По умолчанию find_package ожидает, что пакет установлен в вашей системе.

Если у вас есть простой локальный клон, то вы должны предоставить Find***.cmake файл в пути к модулю, который соответствует имени модуля.

Например, создайте файл с именем Findnlohmann_json.cmake с таким содержимым, как это:

if( TARGET nlohmann_json )
  return()
endif()

if(NOT NLOHMANNJSON_ROOT)
  set(NLOHMANNJSON_ROOT "${PROJECT_SOURCE_DIR}/lib/json")
endif()

add_library( nlohmann_json INTERFACE )
target_include_directories(
  nlohmann_json
  INTERFACE
    ${NLOHMANNJSON_ROOT}/include
)

См. https://cmake.org/cmake/help/latest/command/find_package.html#search -procedure для получения дополнительной информации.

Подход с локальным источником

Тем не менее, если вы храните библиотеку в дереве исходных текстов, вам может быть проще просто вызвать add_subdirectory из вашего проекта CMakeLists.txt:

project(my_json CXX)
add_subdirectory( lib/nlohmann_json )

//...
target_link_libraries( myApp PRIVATE nlohmann_json )

Имейте в виду, что не все библиотеки готовы для включения таким способом

...