【问题标题】:Create a podspec for a C++ library为 C++ 库创建 podspec
【发布时间】:2020-06-16 17:57:24
【问题描述】:

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

实际上我的主要问题是标题,我的 C++ 库依赖于 ext_inc 目录中库存储库中包含的 rapidjson(文件类似于 ${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 应用程序的核心,所以我应该尽可能地保持跨平台)。

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

'HEADER_SEARCH_PATHS' => 'ext_inc'

...但没有任何效果。

据我所知,cocoapods 从 podspec 文件构建了一个 xcode 项目,并使用模块映射来映射所有源文件和头文件,就像它们都在一个目录中一样,并且在这个上下文我的标题包含路径的事实打破了一切......有一种方法可以在模块映射中“保存”带有路径的标题?

【问题讨论】:

  • 为什么不只更改 Additionnal Include Directories 项目参数?因为现在,我想它是这样定义的:.../rapidjson/ 这就是为什么当你写 #include "prettywriter.h" 而不是当你写 #include "rapidjson/prettywriter.h" 时它工作的原因
  • HEADER_SEARCH_PATHS 是“附加包含标头”的 xcconfig 名称
  • 您的HEADER_SEARCH_PATHS 必须设置在绝对路径中,如下所示:${PROJECT_SOURCE_PATH}/ext_inc/ 而不仅仅是这样ext_inc
  • PROJECT_SOURCE_PATH 环境变量未配置...我在 cocoapods 文档中找不到该变量的正确名称...
  • ${PROJECT_SOURCE_PATH}(代表Additionnal Include Directories)必须是你的IDE的一个变量,不能是像PATH, USERNAME, ...这样的环境变量。因为它的值会根据项目源的路径而变化。示例:如果您将项目复制到 G:\myProject ${PROJECT_SOURCE_PATH} = G:\myProject

标签: c++ ios cocoapods podspec


【解决方案1】:

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

解决方案需要多个步骤。

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

因此,如果您想访问位于 pod 项目存储库中 ext_inc 内的 rapidjson/prettywriter.h,这就是我必须做的:

注意: spec 是 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__ 的 ruby​​ 技巧来构建,因为这是使用 pod lib lint(本地存储库)的唯一方法) 使用 pod repo push(动态克隆存储库)。

【讨论】:

    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多