问题描述
我们正在尝试将.a
静态lib文件集成到React Native项目中。在构建期间,我们遇到一个错误,该错误是在单个.a
文件中发现多次声明一个符号(常量)。
我们还尝试将其集成到正常的Xcode项目中,同时具有基本相同的构建配置。 Xcode只会发出有关重复符号的警告,并且构建成功。
下面的屏幕快照显示了我们在 react-native 项目中使用的链接器标志。我们怀疑是导致其他问题的原因是来自其他必需的 react-native pod的继承的链接器标志。有没有办法忽略此错误或单独构建它们?
更新#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/。