2011-03-09 50 views
10

我一直在尝试为应用程序开发构建一组可重用的库,但我开始遇到问题。重复的符号:在静态库B中包含静态库A,在XCode项目中也包含库A和B

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

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

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

但是,当我尝试构建我的XCode项目时,我得到重复符号的错误,因为Lib A中定义的符号也被定义在库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) 

我该如何解决这个问题?我想开发可重用的库来加速我的应用程序开发,并通过测试/改进的代码提高稳定性。我是否从错误的角度来看待这个问题?我正在为iOS开发,因此我不能使用dylib,它们必须是静态的。

如何将这些库包含在我的项目中,当它们相互依赖并避免重复的符号?

+2

对于项目B而言,尽管您听起来有多奇怪,但与Lib A链接并不合适。如果他们是动态库,那很好,但它们是静态库,即目标文件的存档,仅此而已。通过“链接”反对库A,您正在指示归档程序从库A中获取所有对象,并将它们添加到项目B中的所有对象中。 – Troubadour 2011-03-09 23:01:14

回答

7

尽管Lib B依赖于Lib A,但您实际上并不想将A中的所有对象都放入B中,而这正是您通过外观所做的。我不确定你是如何管理的,但我会想象当你建立Lib B与Lib A相连时?如果是这样,只需从Lib B的构建线中省略Lib A即可。Lib A中的所有符号在Lib B中都是未定义的。

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

+0

“将所有对象从A放入B中”是什么意思?我根本不复制代码。我构建lib B的XCode项目将它与lib A链接起来。然后我的应用程序的XCode项目与Lib A和Lib B链接。我更新了我的问题,以澄清项目间链接的方式。 – 2011-03-09 22:43:16

+1

通过将lib B与lib A链接起来,您可以有效地获取lib A中存档的所有对象,并将它们放入lib中。最终结果是“lib A和B”。构建lib B存档时不要链接到lib A. – Troubadour 2011-03-09 22:48:03

+0

哦! * facepalm *我认为我的应用程序项目也必须直接链接到lib A,但我想我只需要应用程序项目就可以知道Header文件的位置。谢谢!这工作很好。 – 2011-03-09 23:03:23