复制符号:在静态库B中包含静态库A,在XCode项目中也包含库A和B.

我一直在尝试为应用程序开发构build一组可重用的库,但是我开始遇到一个问题。

我的一个静态库是一套通用的方法(Objective-C基础类的类别,以提高其可用性),我倾向于在每个项目中使用它们。 (我们将其称为Lib A …即XCode项目A产生libProjectA.a)

然后,我有其他的静态库,包含专门的math代码等等(我们称之为库B)。库B链接到库A,因为它需要使用一些通用function。 (即XCode项目B与libProjectA.a链接并生成libProjectB.a)

在我的XCode项目中,我想包含并依赖于Lib A,因为它具有我一直使用的一般用途。 我也想包括和依赖于Lib B,因为我需要这个专门的mathfunction。 (即我的应用程序项目希望链接libProjectA.a和libProjectB.a)

但是,当我尝试构build我的XCode项目时,出现重复符号的错误,因为Lib A中定义的符号也在Lib B中定义。

ld: duplicate symbol _OBJC_METACLASS_$_Foo in /Users/kenny/xcode_build/Release-iphonesimulator/lib_ApplicationCore.a(Foo.o) and /Users/kenny/xcode_build/Release-iphonesimulator/lib_SpecializedMath.a(Foo.o) 

我怎样才能解决这个问题? 我想开发可重用的库来加速我的应用程序开发,并通过testing/改进的代码来提高稳定性。 我从错误的angular度来看待这个问题吗? 我正在开发的iOS,所以我不能使用dylibs,他们必须是静态的。

如何将这些库包含在我的项目中,以避免重复的符号?

虽然Lib B依赖于Lib A,但实际上并不想将A中的所有对象都放到B中,而这正是您所看到的。 我不知道你如何pipe理,但我会想象当你build立Lib B链接到Lib A? 如果是这样的话,只需从Lib B的构build行中省略Lib A即可。Lib A中的所有符号在Lib B中都是未定义的。

静态库只是对象文件的档案,所以两者应该完全分开。 当您需要链接到Lib B时,只需指定Lib A即可。

这个线程讨论使用命令行工具删除重复。

如何处理来自第三方库的重复符号错误?

他们提取了.a文件里面的.a文件,并删除了重复,然后再次合并。