如何忽略lib文件中的重复符号错误?

问题描述

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

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

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

linker flags

error

更新#1

在进一步调查中,我发现从-ObjC中的OTHER_LDFLAGS手动删除Pods-{TARGET_NAME}.xcconfig可以使项目生成,但是在运行时会崩溃,因为RCTRootView取决于它。

解决方法

原因很可能是在标头文件中定义的,打算内联但未声明为内联的函数。当它们被编译为.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/