在 iOS 中为静态库添加前缀时过滤不需要的符号
Posted
技术标签:
【中文标题】在 iOS 中为静态库添加前缀时过滤不需要的符号【英文标题】:Filter unwanted symbols when prefixing static library in iOS 【发布时间】:2015-04-30 05:04:08 【问题描述】:我正在尝试为 PayPal 静态库添加前缀,以便实现我们框架的客户端能够使用它的不同版本。我一直在关注this article 和this post,但我遇到了一些问题。
-
我创建了一个目标并将 libPayPalMobile.a 添加到与二进制库的链接。
我已经添加了上面教程中提到的run script。
我已将目标作为依赖项添加到项目中。
NamespacedDependencies.h
生成后,我在 Externs 部分看到了一些不需要的符号:
// Externs
#ifndef k1PasswordButtonWidth
#define k1PasswordButtonWidth __NS_SYMBOL(k1PasswordButtonWidth)
#endif
#ifndef k1PasswordButtonRightMargin
#define k1PasswordButtonRightMargin __NS_SYMBOL(k1PasswordButtonRightMargin)
#endif
l002
l003
l004
l003
l004
l005
l006
l001
l007
l002
l008
l003
l009
l010
l007
l011
l004
l012
l008
l009
l005
l010
l011
l003
l012
l004
l003
l005
l013
l003
l006
l004
l014
l003
l015
l007
l004
l016
l004
l008
l001
l005
l005
l002
...
我想我可以使用 grep -v "l[0-9]0,5"
删除这些,但它们似乎被上面的符号转储了,这意味着我不能简单地过滤掉这些。
显然,问题是我什至无法编译,因为我收到了Parse Issue: Unknown type name l002
。
知道这些邪恶的东西是什么以及如何摆脱它们吗?
编辑: 这是脚本的外部部分:
echo "// Externs" >> $header
nm $CODESIGNING_FOLDER_PATH | sort | uniq | grep " D " | cut -d' ' -f3 | grep -v "\$_NS" | grep -v "\$_UI" | sed -e 's/_\(.*\)/#ifndef \1\'$'\n''#define \1 __NS_SYMBOL(\1)\'$'\n''#endif\'$'\n''/g' >> $header
nm $CODESIGNING_FOLDER_PATH | sort | uniq | grep " S " | cut -d' ' -f3 | grep -v "\$_NS" | grep -v ".eh" | grep -v "\$_UI" | grep -v "OBJC_" | sed -e 's/_\(.*\)/#ifndef \1\'$'\n''#define \1 __NS_SYMBOL(\1)\'$'\n''#endif\'$'\n''/g' >> $header
【问题讨论】:
【参考方案1】:与其尝试将 PayPal 库作为自己的一部分进行分发,我鼓励您表达依赖关系,以便开发人员始终获得最新版本。
我还鼓励您使用 PayPal ios SDK,或者更好的是 Braintree SDK(包括 PayPal),而不是过时的 MPL。 Braintree 和 iOS SDK 都发布到 Cocoapds 以简化依赖管理。
【讨论】:
我理解你的做法。虽然,我们不得不强制开发人员使用最新版本的 PayPal SDK。一些集成我们框架的应用程序已经很老了,我们希望避免强迫开发人员对其根应用程序进行更改。 保持对旧集成的支持是有意义的。但是,旧版 SDK 和 API 上的功能开发已停止,因此这些集成不会从更新的用户体验中受益。我不希望看到新的集成也走这条路。以上是关于在 iOS 中为静态库添加前缀时过滤不需要的符号的主要内容,如果未能解决你的问题,请参考以下文章
MSVC 中的链接错误 LNK2019,带有 __imp__ 前缀的未解析符号,但应该来自静态库
使用 angular-cli 在 Angular 中为静态文件添加前缀路径
当 iOS 应用程序链接到静态库时,如何获取丢弃的符号列表?
ios iPhone / iPad - 带有 GData 静态库 libGDataTouchStaticLib.a 的项目在构建时失败(重复符号)