在 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_load
将ONLY_ACTIVE_ARCH
设置为NO
将VALID_ARCHS
和ARCHS
设置为armv7
和arm64
使用 Release 构建配置构建
从 DerivedData/../../Products/ 抓取 .framework 文件
当我将此 .framework 放入我的 swift 项目时,添加到我的目标常规设置中的 Embedded Binaries 部分,导入框架并使用它的类之一,我得到 undefined symbols for architecture arm64
或 undefined 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.dylib
或libz.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
- No
,Strip Linked Product
- No
,Strip Style
- Debugging Symbols
,Dead code stripping
- Yes
。我尝试将Dead code stripping
设置为No
,但框架无法编译。
顺便说一句,静态库是较旧的 webrtc 构建,如果有帮助,可以对 c++ 代码进行一些自定义更改。但是,这个静态库在旧的 Obj-C 项目中运行良好。
很奇怪,可能你就知道了,看看官方webrtc/ioslink如果有用的话,尤其是设置部分..
是的,但是为什么 xcode 会去除静态库中存在的这些符号呢?我相信它与webrtc构建过程无关
您是否阅读了该链接的最新行:您的问题似乎与用于制作框架的构建脚本中的架构列表有关。无论如何,您都可以按照说明拆分二进制文件并在没有 x86-64 的情况下重新创建它,还有一个 link 可以做到这一点。你可以试试看是不是你的问题..以上是关于在 Cocoa Touch 框架中包装静态库的主要内容,如果未能解决你的问题,请参考以下文章