Нужна помощь в том, что я пропустил, чтобы включить rapidjson в мой проект C++

Вопрос или проблема

Итак, у меня есть структура каталога проекта, представленная ниже

Application
-Utils
 -Transport
  -include
   -Foo.h
  -src
   Foo.cpp
   CMakelists.txt(a)
 -CMakeLists.txt(b)
-third_party
 -argparse
 -rapidjson ( новый добавленный)
  -bin
  -include
  ...
  -CMakeLists.txt
 -CMakeLists.txt(c)

CMakelists.txt(a) выглядит следующим образом

add_library(${PROJECT_NAME}
    Foo.cpp
)

target_include_directories(${PROJECT_NAME}
    PUBLIC
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

target_link_libraries(${PROJECT_NAME}
    PUBLIC
    ...
    CURL::libcurl
    RapidJSON <--новый добавленный
)

CMakelists.txt(b) выглядит так

project(Transport LANGUAGES CXX)

add_subdirectory("src")

А CMakelists.txt(c) выглядит следующим образом

add_subdirectory(argparse)
add_subdirectory(rapidjson) <--новый добавленный

Обратите внимание, что до добавления rapidjson мое приложение компилировалось, но поскольку возникла необходимость добавить rapidjson, я добавил его, и так как rapidjson также является библиотекой только заголовков, как argparse, я скопировал его в папку third-party, добавил подкаталог для rapidjson и затем добавил зависимость на RapidJSON. Но когда я пытаюсь включить

#include “rapidjson/document.h”

в Foo.cpp, я получаю ошибку

fatal error: 'rapidjson/document.h' file not found
    1 | #include "rapidjson/document.h"
      |          ^~~~~~~~~~~~~~~~~~~~~~

Правильно ли я понимаю, что поскольку rapidjson является библиотекой только заголовков, его CMakelist.txt создаст интерфейсную цель RapidJSON, которую я могу включить в другие цели моего проекта, которые требуют rapidjson, и поскольку согласно https://github.com/Tencent/rapidjson/blob/v1.1.0/CMakeLists.txt#L107 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include), то #include “rapidjson/document.h” кажется правильным для меня.

Обратите внимание, что хотя я не думаю, что это необходимо, я пытался включить find_package(RapidJSON) в корневой CMakelists.txt, чтобы посмотреть, устранит ли это проблему, но возникла ошибка

CMake Error at cmake-build-debug/third_party/rapidjson/RapidJSONConfig.cmake:3 (include):
  include could not find requested file:

Буду признателен за любые указания на то, что я пропустил здесь или какие предположения неверны.

Ответ или решение

Чтобы успешно включить RapidJSON в ваш проект на C++, важно проверить и убедиться в правильном подключении библиотеки и корректной организации файловой структуры. Рассмотрим шаг за шагом возможные ошибки и недочёты в вашей реализации.

1. Проверка структуры каталогов

Ваше описание структуры проекта показывает, что RapidJSON был добавлён в папку third_party, однако необходимо убедиться, что все необходимые файлы библиотеки находятся на своих местах. RapidJSON следует хранить с соответствующей структурой, которая включает каталоги, такие как include/rapidjson/.

2. Настройка CMake

Согласно вашему описанию, вы правильно добавили add_subdirectory(rapidjson) в файл CMakeLists.txt(c). Однако, надо убедиться, что в самом CMakeLists.txt внутри папки RapidJSON присутствуют строки для указания директории заголовочных файлов:

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

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

CMakeLists.txt(a)

Убедитесь, что target_include_directories для вашей библиотеки Transport также содержит директорию RapidJSON. Например:

target_include_directories(${PROJECT_NAME}
    PUBLIC
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/../third_party/rapidjson/include>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

3. Проверка подключения заголовочного файла

Ошибка, которую вы получаете:

fatal error: 'rapidjson/document.h' file not found

может возникнуть из-за некорректного пути, который CMake не может найти. Убедитесь, что в вашем файле Foo.cpp у вас имеется следующая строка:

#include <rapidjson/document.h>

Обратите внимание, что вы используете <rapidjson/document.h>, а не "rapidjson/document.h". При использовании угловых скобок компилятор ищет заголовок в системных директориях и в директориях, добавленных через target_include_directories, в то время как кавычки подразумевают поиск в локальной директории.

4. Удаление ненужных вызовов find_package

В вашем случае вызов команды find_package(RapidJSON) может быть необязательным, так как RapidJSON не требует дополнительно поиска, если вы правильно указываете его директории. Рекомендуется удалить этот вызов, чтобы избежать путаницы и ошибок, связанных с неопределёнными переменными.

5. Генерация и сборка проекта

После внесения исправлений не забудьте удалить или очистить кэш CMake из предыдущих сборок (папку cmake-build-debug или аналогичную) и заново запустить процесс сборки. Это можно сделать, используя команду:

rm -rf cmake-build-debug
mkdir cmake-build-debug
cd cmake-build-debug
cmake ..
make

Заключение

Следуя описанным шагам, вы должны устранить проблему с подключением RapidJSON в вашем проекте. Убедитесь, что структура файлов и настройки CMake как можно более точны, чтобы избежать дополнительных проблем. Если после выполнения всех шагов ошибка всё ещё сохраняется, проверьте логи CMake и убедитесь, что пути до заголовочных файлов действительно указаны корректно.

Оцените материал
Добавить комментарий

Капча загружается...