【问题标题】:Static libraries have same function names causing duplicate symbol error静态库具有相同的函数名称导致重复符号错误
【发布时间】:2011-10-19 17:34:23
【问题描述】:

我在我的 iPad 应用程序中使用了 2 个第三方库。我不知道这些库的源代码。 这些库在两者中都具有相同名称的函数。因此,由于函数名称冲突,我收到“Apple Mach - O (id) 错误”。我无法更改其中的函数名称,因为源代码未知。在构建应用程序时发生错误。

错误表明:

ld:在 /Users/Desktop/untitled 中重复符号 _T_strcpy 文件夹/Universal/lib/simulator/myLib.a(mem.o) 和 /Users/Library/Developer/Xcode/DerivedData/iOS-aqpprpcivvjjadbsutqqmtjsoczk/Build/Intermediates/ios.build/Debug-iphonesimulator/myApp iPad.build/Objects-normal/i386/pdcrypte2.o 用于 i386 架构 collect2: ld 返回 1 退出状态命令 /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-g++-4.2 退出代码 1 失败

有人可以分享一些建议吗?

【问题讨论】:

  • 可以肯定的是,创建这些静态库的人没有遵循正确的设计模式。所有的类都应该有一个特定的前缀以避免像你这样的情况。不要以为你可以做任何事情。
  • 可能重复:stackoverflow.com/questions/6925609/…。甚至临时构建文件夹的名称都相同(xxx/iOS-aqpprpcivvjjadbsutqqmtjsoczk/xxx)
  • @Cyprian:可能是一些普通的 C 库,由一些粗心的学生、助理甚至 (sic) 教授编写(这显然是一个大学项目)。跨度>

标签: iphone objective-c ipad xcode4


【解决方案1】:

你已经被搞砸了。原始库的创建者未能遵守库开发的最基本规则之一:在所有导出的符号前加上库特定的前缀,以避免命名空间冲突。

您唯一的出路是使用具有命名空间前缀名称的包装器包装每个库中的每个函数,将库静态链接到包装器和strip 所有未导出的符号。然后使用包装库和符号名称。

实际上,如果库是静态的,您可以解决此问题:How to deal with symbol collisions between statically linked libraries?

【讨论】:

  • 感谢您的回复.. 为库中的每个函数创建包装器?
  • @Rio J:好吧,通过编写它:为您使用的库中的每个函数编写一个具有相同签名的小蹦床函数转发函数调用——实际上最简洁的包装方式是重写库符号表中的符号。但是,您当然也必须调整头文件中的每一个符号(在预包含的帮助头文件中没有一大堆#define 语句无法解决)。
  • 我不知道有这样一个专门的符号表操作工具。尽管反汇编库,但使用 sed 编辑符号名称并重新组装它确实可以解决问题。在同一步骤中,您还可以自动生成重写头文件。
  • 我刚刚发现objcopy 实用程序提供了一个选项,可以为所有符号添加自定义字符串的前缀。所以你可以先用nm转储所有符号,写#define前缀头,然后objcopy --prefix-symbols=${LIBRARY_NAME}
  • 我会尝试做那个 datenwolf。你能提供一些相同的示例代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
相关资源
最近更新 更多