我在创建 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/