Создайте podspec для библиотеки C++

У меня возникли проблемы с созданием файла 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 и использует сопоставление модулей для сопоставления всех исходных файлов и файлов заголовков, как будто они все находятся в одном каталоге, и в этом контексте факт что мои заголовки включают в себя путь, все ломается... есть ли способ «сохранить» в карте модуля заголовок с путем?


person gabry    schedule 04.03.2020    source источник
comment
почему вы не меняете только аргумент проекта Additionnal Include Directories? потому что теперь, я полагаю, это определяется так: .../rapidjson/ вот почему это работает, когда вы написали #include "prettywriter.h", а не когда вы написали #include "rapidjson/prettywriter.h"   -  person Landstalker    schedule 04.03.2020
comment
HEADER_SEARCH_PATHS — это имя xcconfig для дополнительных заголовков Include.   -  person gabry    schedule 04.03.2020
comment
ваш HEADER_SEARCH_PATHS должен быть установлен в абсолютном пути следующим образом: ${PROJECT_SOURCE_PATH}/ext_inc/ а не просто так ext_inc   -  person Landstalker    schedule 04.03.2020
comment
Переменная среды PROJECT_SOURCE_PATH не настроена... Я не могу найти в документации Cocopods правильное имя этой переменной...   -  person gabry    schedule 04.03.2020
comment
${PROJECT_SOURCE_PATH} (который представляет Additionnal Include Directories) должен быть переменной вашей IDE и не может быть переменной среды, такой как PATH, USERNAME, .... Потому что его значение меняется в зависимости от пути исходников вашего проекта. Пример: если вы скопируете свой проект в G:\myProject ${PROJECT_SOURCE_PATH} = G:\myProject   -  person Landstalker    schedule 04.03.2020
comment
Мы говорим здесь не об IDE, а о командах: pod lib lint --verbose myname.podspec pod repo push myname.podspec ... во всяком случае, я нашел переменную, определенную Cocoapods, то есть $PROJECT_DIR   -  person gabry    schedule 04.03.2020
comment
вы говорите, что когда вы ставите #include "prettywriter.h", это означает, что ${PROJECT_SOURCE_PATH}/ext_inc/rapidjson/ уже определен как дополнительная включаемая папка. На каком этапе это было настроено?   -  person Landstalker    schedule 04.03.2020
comment
Это означает, чтоcocopods захватывает все исходные файлы и заголовочные файлы и помещает их в одну папку, в любом случае у меня есть решение, оно немного запутанное, но оно работает. Я опубликую это как ответ прямо сейчас.   -  person gabry    schedule 06.03.2020


Ответы (1)


После нескольких дней борьбы с этой темой я нашел решение.

Решение требует нескольких шагов.

  • Вы должны указать внутри файла podspec, что вы хотите сохранить путь
  • затем вы должны указать в пути поиска заголовков, используемом при проверке модуля (pod lint / pod repo push), где найти заголовки.
  • затем вы должны указать в пути поиска заголовков конечного приложения, где находятся заголовки.
  • push pod lib lint/pod repo следует запускать с параметром --skip-import-validation.

Итак, учитывая, что вы хотите получить доступ к rapidjson/prettywriter.h, который находится внутри ext_inc внутри вашего репозитория проекта модуля, вот что мне нужно было сделать:

примечание: спецификация — это объект внутри ruby ​​myproject.podspec.

   spec.preserve_paths = 'ext_inc/**'
   spec.pod_target_xcconfig = {
       'HEADER_SEARCH_PATHS' => "\"" + __dir__ + "/ext_inc\""
   }
   spec.xcconfig = {
       'HEADER_SEARCH_PATHS' => "\"${PODS_ROOT}/report-base/ext_inc\""
   }

Странно то, что мне нужно собрать рубиновый трюк с использованием __dir__, так как это был единственный способ работать как при использовании pod lib lint (локальный репозиторий), так и при использовании push репозиторий pod (клонирование репозитория на лету).

person gabry    schedule 06.03.2020