工程链接静态库的时候,通过删除class来解决重复的符号的错误
2014-07-23 11:21
232 查看
工程链接静态库的时候,通过删除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的错误了。
相关文章推荐
- 工程链接静态库的时候,通过删除class来解决重复的符号的错误
- Myeclipse下发布工程的时候,提示有包重复被部署到服务器--解决办法
- android创建工程的时候出现错误:;;;adjjusting android project classpath
- libMobClickLibrary.a文件引入Xcode5.0工程时候造成错误的问题解决
- 关于ios 程序加载百度地图lib,出现链接错误:找不到符号 (null): _OBJC_CLASS_$_BMKMapManager的解决办法
- MYSQL1130错误的解决方案+通过Navicat for MySQL远程连接的时候报错mysql 1130的解决方法
- 解决android工程引用多个jar包导致的文件重复的错误
- 通过xib加载textfield的时候 发生 this class is not key value coding-compliant for the key textField. 情况怎么解决
- 成功解决interdev创建新工程的时候出现无法连接web服务器的错误
- 关于MYSQL通过子查询删除重复数据的for update报错问题解决
- SQL2005删除用户的时候,产生“数据库主体在该数据库中拥有架构,无法删除”错误的解决办法
- SQL2005删除用户的时候,产生“数据库主体在该数据库中拥有架构,无法删除”错误的解决办法
- 如何解决maven工程在调试的时候出现classnotfoundexception异常
- VS2005新建项目找不到工程模版错误的解决方法。
- It is indirectly referenced from required .class file 错误的解决
- 高级复制添加主体站点的时候碰到ORA-23375错误的解决方法
- 在配置SPS的 Single Sign-on 服务的时候出现错误的解决方法!
- java.lang.UnsupportedClassVersionError的错误解决
- 解决外部符号错误:_MAIN,_WINMAIN@16,__BEGINTHREAD
- DataGrid删除数据的时候避免错误发生