【问题标题】:How to handle duplicate symbol error from 3rd party libraries?如何处理来自 3rd 方库的重复符号错误?
【发布时间】:2012-07-09 22:50:22
【问题描述】:

我有两个似乎使用相同类的第 3 方库。应该没问题,但是我在构建时遇到了这种类型的错误:

ld: duplicate symbol .objc_class_name_CJSONScanner in /Users/myappOne/TapjoyConnect/Frameworks/libTapjoyConnectSimulatorRewardInstall_Ads_Pinch.a(CJSONScanner.o) and /Developer/Projects/BuildOutput/Debug-iphonesimulator/OtherLibrary_d.a(CJSONScanner.o)

我该如何处理这个问题...

-- 编辑--

...如果源文件不可用?

【问题讨论】:

    标签: iphone objective-c cocoa-touch xcode


    【解决方案1】:

    我将假设这两个第三方库只为您提供了 .a 文件而不是源代码。您可以在终端上使用 libtool、lipo 和 ar 来提取和重组文件。

    查看文件中的架构:

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

    然后只提取armv6,例如:

    $ lipo -extract_family armv6 -output libTapjoy-armv6.a libTapjoy.a
    $ mkdir armv6
    $ cd armv6
    $ ar -x ../libTapjoy-armv6.a
    

    然后您可以从其他库中提取相同的架构到同一目录中,然后像这样重新组合它们:

    $ libtool -static -o ../lib-armv6.a *.o
    

    最后,在您对每个架构完成此操作后,您可以再次将它们与 lipo 组合:

    $ cd ..
    $ lipo -create -output lib.a lib-armv6.a lib-i386.a
    

    这应该消除任何重复的符号,但也会将两个库合并为一个。如果您想将它们分开,或者只是从一个库中删除重复项,您可以相应地修改流程。

    【讨论】:

    • 那么,这是否意味着我的项目应该只引用 lib.a 而不能引用其他两个库文件?
    • 如果你完全按照我的做法去做,那么是的,你会删除其他两个文件并使用新文件。
    • 我刚刚在我正在处理的一个库上发现我必须先调用lipo -remove armv7,然后再调用lipo -extract_family armv6
    • 非常感谢。这解决了我的重复符号问题。
    • @CoryKilger,这对重复符号的实现有什么作用?如果两个不同的框架对每个重复符号有不同的实现,会发生什么?有没有办法解决这种情况下的重复?
    【解决方案2】:

    Cory Kilger 的回答是正确的方法......只是一个小调整,因为我没有评论的声誉。

    在我的 Mac OS 10.8 系统上,这个 lipo 命令是我用来制作用于 ar 的 .a 文件的命令:

    lipo -thin armv6 -output libTapjoy-armv6.a libTabjoy.a
    

    lipo 的手册页说 -extract 和 -extract_family 都生成通用 .a 文件,而我的 ar 命令不会从中提取任何内容。

    【讨论】:

      【解决方案3】:

      如果您拥有这两个静态库的源代码,请构建其中一个而不使用 CJSONScanner 类。如果不这样做,您可以使用命令行中的“ar”从其中一个库中提取 CJSONScanner.o。

      您可能可以将一些魔术标志传递给“ld”来解决此问题,但我不知道它是否立即生效。

      【讨论】:

      • 简单地说,ar 是一个命令行工具的名称。如果您键入man ar,您将看到详细信息,包括功能描述:“创建和维护图书馆档案”。 -x 选项用于提取,但您似乎希望 -d 删除。
      • 这些很可能是胖文件,仅ar 是不够的。他还需要lipolibtool 才能做到这一点。
      • 谢谢。胖文件是什么意思?
      • 一个胖文件包含多个架构。这样您就可以拥有一个文件并让它在模拟器和设备上运行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      相关资源
      最近更新 更多