【问题标题】:How to ignore duplicate symbols error in a lib file?如何忽略 lib 文件中的重复符号错误?
【发布时间】:2020-12-13 16:06:20
【问题描述】:

我们正在尝试将 .a 静态库文件集成到 React Native 项目中。在构建期间,我们遇到了一个错误,即发现一个符号(常量)在单个 .a 文件中声明了多次

我们还尝试将其集成到普通的 Xcode 项目中,同时具有大致相同的构建配置。 Xcode 只会发出关于重复符号的警告,并且构建成功。

下面的屏幕截图显示了我们在 react-native 项目中使用的链接器标志。我们怀疑是来自其他必需的 react-native pod 的继承链接器标志导致了这个问题。有没有办法忽略这个错误或单独构建它们?

更新 #1

当我进一步调查时,我发现手动从Pods-{TARGET_NAME}.xcconfig 中的OTHER_LDFLAGS 中删除-ObjC 允许项目构建,但在运行时崩溃,因为RCTRootView 依赖于它。

【问题讨论】:

  • 您是如何得到一个包含重复符号的.a 文件的?您能否提供任何步骤让其他人重现该问题?
  • 我们的解决方案提供商向我们提供了这个.a 文件,并希望我们能够集成到一个普通的ObjectiveC 项目中。但我们真正需要的是把它集成到一个react-native 项目中。
  • 没有更多信息,我不确定我是否相信它有重复的符号(我不确定这是否可能,因为我希望它是一个错误,会阻止 .a 在第一名)。但是您的问题目前不包含足够的信息来调试 - 例如,完整的错误消息是什么?也许是静态库上nm 的输出?鉴于继承的链接器标志,您是否怀疑其中一个附加库是冲突的?
  • @jtbandes 我附上了构建错误消息。请看一下,谢谢!

标签: objective-c xcode react-native clang ld


【解决方案1】:

原因很可能是头文件中定义的函数,这些函数原本是内联的,但没有声明为内联函数。当它们被编译成 .a 时,其中会有一个符号 foo,如果您的 react-native 项目中包含相同的标头,则会有一个重复的符号 foo

例如:

在 header.h 中

int foo() {
  return(1);
}

而不是

inline int foo() {
  return(1);
}

如果a.cpp中包含header.h并编译成liba.a,然后我们在b.cpp中包含header.h,将b.cpp编译成bo并将bo与liba.a链接,我们将得到foo( ) 作为重复符号。

解决此问题的首选方法是通过添加 inline 关键字来修复 header.h 文件。

如果没有,您可以使用一些讨厌的技巧,例如在预处理器级别重命名符号。 (-DOldSymbol=NewSymbol 标志到“其他 C 标志”构建设置)。您必须对所有发生冲突的符号执行此操作。

请参阅http://atastypixel.com/blog/avoiding-duplicate-symbol-issues-when-using-common-utilities-within-a-static-library/,了解一位开发人员如何解决此问题。

另一种方法是手动删除重复的符号。本质上,使用 lipo 将特定于体系结构的库拆分为单独的 .a 文件,使用 ar 解压缩 .a 文件,删除有问题的 .o 文件,使用 libtool 将剩余的 .o 文件重新打包到新的 .a 文件中,然后使用该 .a文件。请参阅http://atnan.com/blog/2012/01/12/avoiding-duplicate-symbol-errors-during-linking-by-removing-classes-from-static-libraries/ 了解它是如何完成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-05
    • 2020-09-29
    • 1970-01-01
    • 2013-08-31
    • 2016-12-13
    • 2013-12-15
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多