У меня возникли проблемы с созданием файла podspec для извлечения библиотеки C++ из приложения iOS.
На самом деле моей основной проблемой являются заголовки, моя библиотека C++ зависит от rapidjson, который включен в репозиторий библиотеки в каталоге ext_inc (файлы имеют вид ${PROJECT_SOURCE_PATH}/ext_inc/rapidjson/*h).
Если я включу его в исходные файлы следующим образом:
s.source_files = utils/*{cpp,h}', 'handler/*{cpp,h}','ext_inc/**/*h'
Когда я пытаюсь скомпилировать библиотеку с помощью:
pod lib lint --verbose report-base.podspec
Я получаю такие ошибки:
../utils/json_serializer.h:8:10: fatal error: 'rapidjson/prettywriter.h' file not found
Ошибки вызваны тем, что заголовки включены как:
#include "rapidjson/prettywriter.h"
Компиляция продолжается, если я изменю это на:
#include "prettywriter.h"
... но это неправильный способ включения внешней библиотеки, такой как rapidjson, и она вообще не переносима (эта же библиотека также является ядром приложения для Android, поэтому я должен оставаться как можно более кроссплатформенным).
Я попытался избежать этой проблемы, используя подфайл private_header_path и добавив xcconfig с ключом:
'HEADER_SEARCH_PATHS' => 'ext_inc'
... но ничего не работает.
Как я понял,cocopods создает проект xcode из файла podspec и использует сопоставление модулей для сопоставления всех исходных файлов и файлов заголовков, как будто они все находятся в одном каталоге, и в этом контексте факт что мои заголовки включают в себя путь, все ломается... есть ли способ «сохранить» в карте модуля заголовок с путем?
Additionnal Include Directories
? потому что теперь, я полагаю, это определяется так:.../rapidjson/
вот почему это работает, когда вы написали#include "prettywriter.h"
, а не когда вы написали#include "rapidjson/prettywriter.h"
- person Landstalker   schedule 04.03.2020HEADER_SEARCH_PATHS
должен быть установлен в абсолютном пути следующим образом:${PROJECT_SOURCE_PATH}/ext_inc/
а не просто такext_inc
- person Landstalker   schedule 04.03.2020${PROJECT_SOURCE_PATH}
(который представляетAdditionnal Include Directories
) должен быть переменной вашей IDE и не может быть переменной среды, такой какPATH, USERNAME, ...
. Потому что его значение меняется в зависимости от пути исходников вашего проекта. Пример: если вы скопируете свой проект вG:\myProject
${PROJECT_SOURCE_PATH} = G:\myProject
- person Landstalker   schedule 04.03.2020#include "prettywriter.h"
, это означает, что${PROJECT_SOURCE_PATH}/ext_inc/rapidjson/
уже определен как дополнительная включаемая папка. На каком этапе это было настроено? - person Landstalker   schedule 04.03.2020