Вопрос или проблема
Итак, у меня есть структура каталога проекта, представленная ниже
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 и убедитесь, что пути до заголовочных файлов действительно указаны корректно.