c++ - 为 C++ 库创建 podspec

标签 c++ ios cocoapods podspec

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

实际上我的主要问题是 header ,我的 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 并使用 key 添加 xcconfig 来避免此问题:

'HEADER_SEARCH_PATHS' => 'ext_inc'

...但没有任何效果。

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

最佳答案

经过几天的努力,我找到了一个解决方案。

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

  • 您必须在 podspec 文件中指定要保留的路径
  • 然后您必须在 pod 验证(pod lint/pod repo Push)中使用的 header 搜索路径中指定在哪里查找 header 。
  • 然后您必须在最终应用程序的 header 搜索路径中指定 header 所在的位置。
  • 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 存储库推送(动态克隆存储库)。

关于c++ - 为 C++ 库创建 podspec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60522713/

相关文章:

ios - 将模块导入 Cocoa Touch Framework 并将框架嵌入到 App Project 时,没有此类模块 'Alamofire'

c++ - 无法将整数字符串转换为 C++ 中的整数

c++ - 派生类和单例

c++ - main() 函数返回值的转换是如何工作的?

ios - 将 JSON 数组字符串转换为 JSON 数组返回 null

ios - 检查我 View 中的所有文本字段是否为空客观c

ios - 缩略图在 iPhone 或 iPad 上不显示,但在 Android 上显示

ios - Facebook SDK 3.21.1 弃用方法错误

ios - 我们为什么要使用use_frameworks!在 CocoaPods 中?

c++ - Qt 在 .dll 中使用 .dll