我一直在尝试为应用程序开发构建一组可重用的库,但我开始遇到问题。
我的一个静态库是一组通用方法(Objective-C Foundation类的类别,以提高它们的可用性),我倾向于在每个项目中使用它们。 (我们将其称为Lib A ...即XCode项目A生成libProjectA.a)
然后我有其他静态库,包含数学专用代码的东西等等(我们称之为Lib B.)Lib B链接到Lib A,因为它需要使用一些通用功能。 (即XCode项目B与libProjectA.a链接并生成libProjectB.a)
在我的XCode项目中,我想要包含并依赖于Lib A,因为它具有我一直使用的一般用途。我还想包含并依赖Lib B,因为我需要专门的数学功能。 (即我的应用程序Project想要与libProjectA.a和libProjectB.a链接)
但是,当我尝试构建我的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)
如何解决这个问题?我想开发可重用的库来加速我的应用程序开发,并通过经过测试/改进的代码来提高稳定性。我是从错误的角度来看待这个吗?我正在为iOS开发,所以我不能使用dylib,它们必须是静态的。
如果我们的项目彼此相互依赖并避免重复的符号,我如何将这些库包含在我的项目中?
答案 0 :(得分:7)
虽然Lib B依赖于Lib A,但实际上并不想将A中的所有对象都放入B中,这就是你通过它看起来所做的事情。我不确定你是如何管理的,但是我想你在建造自由B时你是否与Lib A有联系?如果是这样,只需从Lib B的构建行中省略Lib A.所有来自Lib A的符号在Lib B中都是未定义的。
静态库只是目标文件的归档,因此两者应该完全分开。当你需要链接Lib B时,只需指定Lib A.
答案 1 :(得分:1)
该主题讨论了使用命令行工具删除重复项。
How to handle duplicate symbol error from 3rd party libraries?
他们在.a文件中提取了.o文件并删除了重复项,然后再次合并。