在 Cocoa Touch 框架中包装静态库

Posted

技术标签:

【中文标题】在 Cocoa Touch 框架中包装静态库【英文标题】:Wrapping static library in Cocoa Touch Framework 【发布时间】:2017-04-11 08:33:08 【问题描述】:

我有一个带有 2 个架构切片(armv7、arm64)的胖静态库。 我正在尝试使它与 swift 一起工作并将其包装到 Cocoa Touch 框架中。

我做什么:

    创建 Cocoa Touch 框架项目 拖一个带头的静态库 将OTHER_LDFLAGS设置为-all_loadONLY_ACTIVE_ARCH 设置为NOVALID_ARCHSARCHS 设置为armv7arm64 使用 Release 构建配置构建 从 DerivedData/../../Products/ 抓取 .framework 文件

当我将此 .framework 放入我的 swift 项目时,添加到我的目标常规设置中的 Embedded Binaries 部分,导入框架并使用它的类之一,我得到 undefined symbols for architecture arm64undefined symbols for architecture armv7

编辑: 不确定它是否有帮助,但我注意到静态库的大小约为 34MB,但生成的 .framework 的大小约为 12MB。

编辑 2: 我在静态库和生成的动态库上都运行了nm -arch arm64 -g myLibraryName。动态库不包含静态库具有的所有符号。似乎 XCode 构建过程剥离了很多。

【问题讨论】:

澄清你想在你的框架内分发库吗?您只是希望能够在框架内使用库,还是还试图将库公开给嵌入框架的应用程序?终于有.dylib 版本的静态库了吗? @tdbit 我正在尝试将静态库包装到 Cocoa Touch 框架,因为我想使用 swift。如您所知,swift 不支持静态库。不,.dylib 不可用。 确保您以正确的方式创建库。检查以下链接以了解创建动态框架的正确方法。 > insert.io/frameworkios8xcode6 > possiblemobile.com/2016/08/ios-frameworks-part-2-build-and-ship 恐怕还没有足够的信息来找到问题的根源。你有没有将你的库添加到链接库中?在构建设置中选择了哪些目标架构?您是否为模拟器目标或设备构建?哪些符号未定义,因为您的库中可能使用了某些 dylib? 嗨,你有办法做到这一点吗?我也面临同样的问题…… 【参考方案1】:

我想你也忘了补充:

项目->目标->构建阶段->将二进制文件与库链接: 添加+:libz.dyliblibz.tbd (从 Xcode 7 开始,*.dylib 文件是 now *.tbd 文件)

一定要清理文件夹:/User/yourname/Library/Developer/XCode/DerivedData

P.S:如果您愿意,您还应该能够通过添加参数 -lz 在 构建设置 中的 “Other Linker Flags” 添加 libz.tbd

【讨论】:

谢谢,但它不起作用。我认为问题在于链接器没有将所有符号添加到生成的动态库中。我刚刚检查了nm 命令。我的设置是:Strip Debug Symbols Druing Copy - NoStrip Linked Product - NoStrip Style - Debugging SymbolsDead code stripping - Yes。我尝试将Dead code stripping 设置为No,但框架无法编译。 顺便说一句,静态库是较旧的 webrtc 构建,如果有帮助,可以对 c++ 代码进行一些自定义更改。但是,这个静态库在旧的 Obj-C 项目中运行良好。 很奇怪,可能你就知道了,看看官方webrtc/ioslink如果有用的话,尤其是设置部分.. 是的,但是为什么 xcode 会去除静态库中存在的这些符号呢?我相信它与webrtc构建过程无关 您是否阅读了该链接的最新行:您的问题似乎与用于制作框架的构建脚本中的架构列表有关。无论如何,您都可以按照说明拆分二进制文件并在没有 x86-64 的情况下重新创建它,还有一个 link 可以做到这一点。你可以试试看是不是你的问题..

以上是关于在 Cocoa Touch 框架中包装静态库的主要内容,如果未能解决你的问题,请参考以下文章

静态 cocoa/cocoa-touch 库应该基于啥样的 SDK?

在 iOS 的动态框架中包含静态库

在 Xcode 静态库中包含框架?

在动态框架中包含静态库的公共头文件

如何打开框架中包含的视图控制器作为 iOS 的静态库?

带有嵌入库的 Cocoa Touch Framework Swift