【问题标题】:Auto linking dependencies of a static lib静态库的自动链接依赖项
【发布时间】:2009-12-10 18:57:33
【问题描述】:

我有一个静态库 A,它也使用静态库 B、C 和 D。

然后我有应用程序 X 和 Y,它们都使用 A,但不使用 B、C 或 D。

有什么方法可以让 X 和 Y 自动看到 A 使用了 B、C 和 D 并将它们链接起来,这样我就不需要跟踪整个依赖关系树,这样我就可以显式传递每个静态库(与 Windows、Boost 等类似的东西很多)?

【问题讨论】:

    标签: c++ gcc linker mingw


    【解决方案1】:

    静态库不与其他静态库链接。只有在构建可执行文件(或共享库/DLL)时才会执行链接,而跟踪这一点的方法是(当然)使用 make。

    【讨论】:

      【解决方案2】:

      我认为,从概念上讲,您可以将库合并在一起以实现您想要的 - 它们只是在为链接器准备好符号集合之后。话虽如此,我从未见过这样做的工具。 lib 的二进制格式是编译器的问题,所以它必须是 mingw 或 gcc 特定的工具。

      就知道 A 使用哪个版本的 Boost lib 而言,除了查找 A 的文档外,没有太多需要。

      【讨论】:

      • 如果您使用 GCC 编译器(或其他 UN*X/Linux 编译器),您可以使用 ar 工具来操作静态库。在这些平台上,库只是串联的目标文件,带有一个可选的索引。但是,从多个较小的图书馆创建一个大型图书馆是否是一个好主意是另一回事。
      【解决方案3】:

      简单的方法是始终提供要链接的特定库 A、B、C 和 D。对于真正的库,链接器只检索所需的模块。

      A 与其他库有一些隐式链接的关键问题是它们不一定是唯一可识别的。例如,它应该使用 2.0 版还是 3.1 版? /usr/share/lib 中的那个还是 /usr/lib/X11/xdm/share/lib 中的那个?等等。

      【讨论】:

      • 问题在于诸如 boost 之类的事情,X 很难知道 A 使用了哪些 boost 库,以及 X 是否碰巧使用了相同的 boost 库链接器错误,因此我希望它自动链接它.如果 A 使用了 1.38 的 boost 和 X 1.40 的 boost,那么无论天气如何,该特定组件的链接都是自动的,或者我通过大量的努力来确定 A 使用了哪个 boost 库。
      猜你喜欢
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 2014-11-22
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多