工程链接静态库的时候,通过删除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的错误了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值