复杂的静态库链接

3
我过去多次嵌套使用静态库,但从未像现在这样,这引起了一些问题。
现在先假设我有三个静态库:A、B和C。并且有一个项目使用它们,如下所示:
A是一个基础库,包含常用的自定义视图、数据结构和类别。B是与A链接的库,包含多个项目共享的视图控制器。C是另一个与A链接的库,包含多个项目共享的视图控制器。
这个特定的项目使用了来自B和C的代码。因此,结构如下:
   A
  / \
 B   C
  \ /
Project

由于 Xcode 静态库的链接方式基本上是合并它们,所以 B 和 C 都拥有 A 的所有符号。因此我遇到了重复符号链接器错误。我该如何处理呢?需要弱化某些链接吗?还是我缺少某个特定的标志?我需要设置除了链接二进制文件之外的其他依赖关系吗?
我已经在谷歌和这里搜索了很多好的信息,但没有找到能够适用于我的情况的。
更新想法:
所以让我问一下,既然静态库虽然可以合并,但实际上不应该这样做,那么是否应该将它们全部放入一个项目中,只需有多个静态库目标?甚至不使用目标依赖项,只有 A、AB 和 AC,以及 ABC 目标包含其目标所需的正确文件和标题?这无疑会使构建设置非常复杂,并可能使源代码分发有些复杂,但它将解决我的当前问题,可能是更好的处理方式。你觉得呢?

为什么 BC 会包含 A 的符号?这听起来一点都不对。 - trojanfoe
因为它们是链接库。 - Ryan Poolos
但是如果B是静态库,而A也是静态库,则Project必须链接到AB。换句话说,在与二进制文件的最终链接之前,B不包含A - trojanfoe
但是B是建立在A之上的。因此,至少在Xcode处理它的方式中,A包含在B中。如果我不将A与B链接起来,那么B将无法编译,因为它缺少从A使用的必要代码。 - Ryan Poolos
所以我之前读过一些类似的东西。但是在B/C中包含A的头文件似乎本质上是错误的,只是为了让编译器不发怒。这真的是正确的方法吗?还是这只是我的当前问题的解决方法?基本上我想说的是这是一个迹象,表明我不应该耦合静态库? - Ryan Poolos
显示剩余4条评论
1个回答

2
看起来您没有正确创建静态库BC,因为您正在包括来自静态库A的目标文件。这是不正确的。相反,让ABC仅包含它们自己的类的目标文件,并在Project二进制文件的最终链接中将它们全部汇聚在一起。
  • 您需要允许B查看A的头文件,以便正确编译。

  • 您需要允许C查看A的头文件,以便正确编译。

  • 您需要允许Project查看ABC的头文件,以便正确编译,以及ABC的库(.a)文件,以便正确链接。

我认为一个Xcode Workspace会在您正确设置项目依赖关系后为您处理所有头文件/库搜索路径设置,但我可能对此有所错误,您可能需要自己设置这些路径。


谢谢。Xcode的工作区肯定可以很好地处理这个问题。 - Ryan Poolos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接