为 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(动态存储库克隆)。
我在创建 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(动态存储库克隆)。