【问题标题】:Complex Static Library Linking复杂的静态库链接
【发布时间】:2013-01-21 19:36:23
【问题描述】:

所以我过去曾多次嵌套静态库,但从来没有像这样嵌套过,这导致了一些问题。

现在假设我有 3 个静态库,A、B 和 C。以及一个使用它们的项目如下。

A 是一个基础库,由常用的自定义视图、数据结构和类别组成。 B 是与 A 链接的库,其中包含在多个项目之间共享的视图控制器。 C 是另一个与 A 链接的库,其中包含在多个项目之间共享的视图控制器。

这个特定的项目使用 B 和 C 的代码。所以结构看起来像这样:

   A
  / \
 B   C
  \ /
Project

由于 Xcode 链接静态库的方式基本上是合并它们,B 和 C 都具有 A 的所有符号。所以我得到了重复的符号链接器错误。我该如何处理这个问题?我需要弱链接吗?还是我缺少一个特定的标志?我是否需要设置某种类型的依赖其他感谢链接二进制文件?

我在这里用谷歌搜索和搜索,发现了很多很好的信息,但没有任何我能够扭曲到这种特殊情况的信息。

想法更新

所以让我问这个问题,因为在阅读了静态库虽然能够合并确实不应该是这样之后,这似乎是一个可能的解决方案。

与其拥有 3 个独立的静态库,我应该将它们全部放在一个项目中,并且只拥有多个静态库目标吗?甚至不使用目标依赖关系,只使用 A、AB 和 AC,以及包含目标文件和标题的 ABC 目标?这对于构建设置无疑会相当复杂,并且可能会使源代码分发有点复杂,但它会解决我当前的问题,并且可能是更好的处理方式。怎么想?

【问题讨论】:

  • 为什么BC 会包含A 的符号?这听起来根本不对。
  • 因为它们是链接库。
  • 但如果B 是静态库而A 是静态库,那么Project 必须与A B 链接。换句话说,B 在与二进制文件的最终链接之前不包含A
  • 但是 B 是建立在 A 之上的。所以至少在 Xcode 处理它的方式上,A 包含在 B 中。如果我不将 A 与 B 链接,那么 B 将不会编译为它的缺少从 A 中使用的必要代码。
  • 那就错了。静态库(.a 文件)只是 .o 文件的存档。您需要将ABC 分开,因此将它们分开Xcode 项目并使用工作区将它们组合在一起。 BC 必须看到 A 的头文件,但它不会链接任何 A 的对象文件。 Project 需要查看{A,B,C} 的头文件和.a 文件才能正确链接。完成此操作后,您的重复符号将消失。

标签: xcode linker static-libraries


【解决方案1】:

看起来您没有正确创建静态库BC,因为您包含来自静态库A 的目标文件。这是不正确的。而是让ABC 只包含它们自己的类的目标文件,并将它们全部放在Project 二进制文件的最终链接中。

  • 您必须允许B 看到A 的头文件才能正确编译。

  • 您必须允许C 看到A 的头文件才能正确编译。

  • 您必须允许Project 看到ABC 的头文件才能正确编译以及A 和@ 987654337@'s 和 C's library (.a) 文件以便正确链接。

认为一旦您正确设置了项目依赖项,Xcode Workspace 将为您处理所有标题/库搜索路径设置,但我可能错了,并且您可能必须自己设置这些路径。

【讨论】:

  • 谢谢。 Xcode 的 Workspaces 肯定能很好地处理这个问题。
猜你喜欢
  • 2010-11-02
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多