频道栏目
首页 > 程序开发 > 软件开发 > Java > 正文
工程链接静态库的时候,通过删除class来解决重复的符号的错误
2014-04-18 14:20:23      个评论    来源:工程链接静态库的时候,通过删除class来解决重复的符号的错误  
收藏   我要投稿

工程链接静态库的时候,通过删除class来解决重复符号(duplicate symbol)的错误

如果你在工程中使用静态库,并且指定了编译选项为-all_load(为了让Objective-C的类别加载正确),静态库中,你的工程包含了一样的class名字,或者跟其他静态库中,有相同的class名字。在链接静,肯定遇到过类似于这样的错误“duplicate symbol”错误。

例如,一个三方库(libProprietary.a),库中使用KissXML解析和生成XML,你的工程中内置一个静态库(libBitsAndBobs.a)也使用KissXML。如果你使用两个库,你将会得到KissXML 的duplicate symbol错误。

一个粗暴并且快捷的办法是,将相同的class名字从其中一个库中移除。下面将介绍一下怎么实现:大致步骤:

1.查看是否是fat的静态库

2.拆成armv6 和i386的两个静态库

3. 解出静态库中的目标文件(.o文件)

4. 删除多余的目标文件

5. 合成armv6或者i386的静态库

6.重新合成fat库。

1、首先,我们需要看看静态库是否是一个“fat file”

意思是:是否包含了多个架构。你会发现很多iOS静态库是fat files,目的是让它们同时可以在真机和模拟器上运行。

$ lipo -info libProprietary.a
Architectures in the fat file: libProprietary.a are: armv6 i386

正如我们说的,这个库就是一个fat file(armv6 和i386两个架构)。

2、我们使用的工具,可以分离fat 静态库为每一个架构一个静态库。

为了这么做。我们还需要使用lipo命令

$ lipo -thin armv6 libProprietary.a -output libProprietary-armv6.a

3、我们也可以用ar来看看静态库中的文件,将目标文件列出来

$ ar -t libProprietary-armv6.a
__.SYMDEF SORTED
FOOBar.o
DDXMLDocument.o
DDXMLElement.o
DDXMLElementAdditions.o
DDXMLNode.o

4、正如我们期望的那样,libProprietary.a 包含了FOOBar.o目标文件,我们在KissMXL中也有这样的目标文件。我们需要从静态库中解除目标文件,然后删除它,然后再组包成静态库文件。

首先,解包:

$ mkdir libProprietary-armv6
$ cd libProprietary-armv6
$ ar -x ../libProprietary-armv6.a

现在,我们有一个包含目标文件的文件夹 libProprietary-armv6

$ ls -1
DDXMLDocument.o
DDXMLElement.o
DDXMLElementAdditions.o
DDXMLNode.o
FOOBar.o
__.SYMDEF SORTED

5、这个时候,将重复的.o文件删除,然后再重新组包:

$ rm DDXML*.o
$ libtool -static *.o -output ../libProprietary-armv6.a

为了确认我们移除了目标文件,可以再次list一下;

$ ar -t ../libProprietary-armv6.a
__.SYMDEF SORTED
FOOBar.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

6、最后,我们需要重新把armv6和i386架构的静态库,组合成fat静态库

lipo -create libProprietary-armv6.a libProprietary-i386.a -output libProprietary-noKissXML.a

如果,一切正确的话,你可以使用 libProprietary-noKissXML.a代替libProprietary.a了,并且不再有duplicate symbol的错误了。


原文地址https://atnan.com/blog/2012/01/12/avoiding-duplicate-symbol-errors-during-linking-by-removing-classes-from-static-libraries

点击复制链接 与好友分享!回本站首页
上一篇:miniui 文本验证提示
下一篇:java面试准备之基础排序——冒泡与选择排序
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站