为 C++ 库创建 podspec

Create a podspec for a C++ library

我在创建 podspec 文件以从 iOS 应用程序中提取 C++ 库时遇到一些问题。

实际上我的主要问题是 headers,我的 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

错误是由于 header 包含为:

#include "rapidjson/prettywriter.h"

如果我将其更改为:

,编译会继续
#include "prettywriter.h"

...但这是包含像 rapidjson 这样的外部库的错误方法,它根本不可移植(同一个库也是 android 应用程序的核心,所以我应该保持跨平台尽可能)。

我尝试使用 podfile private_header_path 并使用密钥添加 xcconfig 来避免此问题:

'HEADER_SEARCH_PATHS' => 'ext_inc'

...但没有任何效果。

根据我的理解,cocoapods 从 podspec 文件构建了一个 xcode 项目,并使用模块映射来映射所有源文件和 header 文件就像它们都在一个目录中一样,在这种情况下,我的 header 包含一个路径这一事实打破了一切......有一种方法可以在模块映射中 "save" 一个 header 有路径吗?

在这个主题上苦苦挣扎了几天后,我找到了解决方案。

该解决方案需要多个步骤。

  • 您必须在 podspec 文件中指定要保留的路径
  • 然后您必须在 pod 验证(pod lint / pod repo push)中使用的 header 搜索路径中指定在哪里可以找到 headers。
  • 那么您必须在 header 最终应用程序的搜索路径中指定 header 所在的位置。
  • pod lib lint/pod repo push 应该是 运行 选项 --skip-import-validation

因此,鉴于您想要访问位于 ext_inc 内的 rapidjson/prettywriter.h,这就是我必须做的:

注: spec是ruby里面的object 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__ 的 ruby 技巧进行构建,因为这是在使用时同时工作的唯一方法pod lib lint(本地存储库),使用 pod repo push(动态存储库克隆)。