重复符号:在静态库 B 中包含静态库 A,在 XCode 项目中也包含库 A 和 B
Posted
技术标签:
【中文标题】重复符号:在静态库 B 中包含静态库 A,在 XCode 项目中也包含库 A 和 B【英文标题】:Duplicate symbol: Include static lib A in static lib B, also include lib A and B in XCode Project 【发布时间】:2011-07-12 07:22:15 【问题描述】:我一直在尝试构建一组可重用的应用程序开发库,但我开始遇到问题。
我的一个静态库是一组通用使用方法(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,因为我需要专门的数学功能。 (即我的应用项目想要与 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,它们必须是静态的。
当它们相互依赖并避免重复符号时,如何将这些库包含在我的项目中?
【问题讨论】:
项目 B 链接到 Lib A 是没有意义的,尽管这听起来很奇怪。如果它们是动态库,那很好,但它们是静态库,即目标文件的存档,仅此而已。通过“链接”到库 A,您指示归档器从库 A 中获取所有对象并将它们添加到项目 B 中的所有对象中。 【参考方案1】:此线程讨论了使用命令行工具删除重复项。
How to handle duplicate symbol error from 3rd party libraries?
他们提取 .a 文件中的 .o 文件并删除重复项,然后再次合并。
【讨论】:
【参考方案2】:尽管 Lib B 依赖于 Lib A,但您实际上并不想将 A 中的所有对象放入 B 中,从外观上看,这是您所做的。我不确定您是如何做到的,但我想当您构建 Lib B 时,您会链接到 Lib A?如果是这样,只需从 Lib B 的构建行中省略 Lib A。来自 Lib A 的所有符号都意味着在 Lib B 中未定义。
静态库只是目标文件的存档,因此两者应该完全分开。当您需要链接到 Lib B 时,也只需指定 Lib A。
【讨论】:
“将所有对象从 A 放入 B”是什么意思?我根本不是在复制代码。我构建 lib B 的 XCode 项目将其与 lib A 链接。然后我的应用程序的 XCode 项目与 Lib A 和 Lib B 链接。我更新了我的问题以阐明项目间的链接方式。 通过将库 B 与库 A 链接,您可以有效地将库 A 中存档的所有对象放入库 B。最终得到的是真正的“库 A 和 B”。构建 lib B 存档时不要链接到 lib A。 哦! facepalm 我认为我的应用程序项目也必须直接链接到 lib A,但我想我只需要应用程序项目知道头文件的位置。谢谢!效果很好。 @Kenny Wyland:不完全是!您的最终应用确实需要同时链接到 A 和 B。B 没有“链接”到 A。lib A 只是来自项目 A 的目标文件的存档。同样,lib B 应该只是来自项目 B 的文件的存档。静态库没有与动态库相同的内置依赖项,因此您不(不应该)在创建存档时尝试指定这些依赖项。是的,A 中会有一些符号在 B 中未定义,但是当您在最终目标(即您的应用程序)中将 A 和 B 都指定为依赖项时,它们会得到解决。 @Kenny Wyland:就是这样。发现。抱歉回复晚了,我上次评论后就去睡觉了!以上是关于重复符号:在静态库 B 中包含静态库 A,在 XCode 项目中也包含库 A 和 B的主要内容,如果未能解决你的问题,请参考以下文章