Avoiding duplicate symbol errors during linking by removing classes from static libraries
来源:互联网 发布:电极编程 编辑:程序博客网 时间:2024/06/06 02:59
原文链接:http://atnan.com/blog/2012/01/12/avoiding-duplicate-symbol-errors-during-linking-by-removing-classes-from-static-libraries/
假如你得xcode项目工程在编译静态库的使用使用了-all_load标志来保证objc的category加载正确,你可能会在链接的时候得到“duplicate symbol”的错误信息,这是因为静态库内包含了相同的.o文件。
假如一个第三方的静态库叫(libProprietary.a
)已经使用了KissXML,而项目中的另一个库(libBitsAndBobs.a
) 也使用了KissXML,如果你同时使用了这两个库,你就会得到 duplicate symbol的错误信息(DDXMLDocument,DDXMLElemet&DDXMLNode).
所以我们可以从静态库中移除一部分编译的类,下面就是方法。
$ lipo -thin armv6 libProprietary.a -output libProprietary-armv6.a
首先,我们得查看下这个静态库是否是一个包含多个架构的静态库(fat file),因为一个静态库可能需要在不同的cpu架构上运行,如armv6/armv7,模拟器i386等。
在终端下输入
$ lipo -info libProprietary.aArchitectures in the fat file: libProprietary.a are: armv6 i386
可以看到这个静态库是个包含多个cpu架构的静态库,我们需要分离出单个架构的.a文件
下面我们使用命令来查看下这个.a文件包含了多少个类
$ ar -t libProprietary-armv6.a__.SYMDEF SORTEDFOOBar.oDDXMLDocument.oDDXMLElement.oDDXMLElementAdditions.oDDXMLNode.o
和我们期望的一样这个文件里面除了FOOBar.o文件,也包含了DDXML相关的.o文件,我们现在需要做的是解开这个.a文件,把里面的DDXML*.o相关文件移除,然后重新打包这个.a文件。在终端下面:
$ mkdir libProprietary-armv6$ cd libProprietary-armv6$ ar -x ../libProprietary-armv6.a我们创建了一个文件夹,然后解压了.a文件,接下来:
$ ls -1DDXMLDocument.oDDXMLElement.oDDXMLElementAdditions.oDDXMLNode.oFOOBar.o__.SYMDEF SORTED可以看到有不同的.o文件,然后我们删除DDXML相关的.o文件,然后重新组装.a文件:
$ rm DDXML*.o$ libtool -static *.o -output ../libProprietary-armv6.a最后我们确认下我们组装的.a文件包含的.o文件是否正确:
$ ar -t ../libProprietary-armv6.a__.SYMDEF SORTEDFOOBar.o到目前为止我们只是修改了armv6的架构,i386的我们在用这个命令操作一遍:
$ lipo -thin i386 libProprietary.a -output libProprietary-i386.a$ mkdir libProprietary-i386 && cd libProprietary-i386$ ar -x ../libProprietary-i386.a$ rm DDXML*.o$ libtool -static *.o -output ../libProprietary-i386.a最后我们把两个架构的.a文件合并成一个.a文件:
lipo -create libProprietary-armv6.a libProprietary-i386.a -output libProprietary-noKissXML.a假如一切正确,你可以用这个.a文件替换原来的.a 文件,这些错误信息也会消失。
0 0
- Avoiding duplicate symbol errors during linking by removing classes from static libraries
- Avoiding duplicate symbol errors during linking by removing classes from static libraries
- Avoiding duplicate symbol errors during linking by removing classes from static libraries
- Duplicate symbols when linking ObjectiveC static libraries
- Avoiding duplicate session detected errors in LCDS (and BlazeDS)
- Avoiding duplicate session detected errors in LCDS (and BlazeDS)
- Xcode Multiple Static Libraries and Duplicate Symbols
- LPC2478 KEIL linking errors
- Why are classes with static data members getting linker errors?
- Chapter 7 Linking ---Static Linking
- static linking and dynamic linking
- Avoiding Out of Memory Errors
- Kernel Compilation& Avoiding ‘Unresolved Symbol’
- duplicate symbol
- Leopard Linking: making relocatable libraries
- Static Linking on AIX
- Android Static Linking vs Dynamic Linking
- Iterating through a Collection, avoiding ConcurrentModificationException when removing in loop
- JS动态生成DIV
- NSDateFormatter用法
- GIT如何撤销修改
- 轻松理解javascript中的局部变量与全局变量以及this的问题
- Serialize and Deserialize Binary Tree
- Avoiding duplicate symbol errors during linking by removing classes from static libraries
- 微信SDK踩过的那些坑。。登录分享支付
- 计蒜客挑战难题:元素移除
- 编程以来遇到的常见的前端优化(持续更新)
- Android源码编译(3)---下载源码
- 计算机网络基础知识总结
- 使用Gallery来实现图片的3D效果
- 开通博客了,争取每周4篇技术类博客。
- 计蒜客挑战难题:寻找插入位置