【问题标题】:Linking a dynamic library into a static library (aka pre-linking a dynamic library)将动态库链接到静态库(也就是预链接动态库)
【发布时间】:2011-07-07 16:15:47
【问题描述】:

我有一个非常小的库,我想转用静态库 (libx.a),但这个库依赖于动态库 (liby.so)。我希望能够“预链接”我的静态库,以便 libx.a 已经包含对 liby.so 的引用。

这基本上允许我在编译存在 -lx 的程序时不指定选项 -ly。这使得链接 libx 时变得更简单,尤其是当它依赖于许多共享库时。

有可能吗?如果是,如何(假设 gcc)?

如果可能的话,如果使用 libx 的程序使用 liby 本身,是否会发生某种有趣的重复(我想是变量)?

【问题讨论】:

    标签: c dynamic static linker


    【解决方案1】:

    我很困惑您是否真的想将共享库代码包含到静态库存档中,或者您是否只想让它链接静态库自动创建对共享库的引用。

    在前一种情况下,我知道没有工具可以做到这一点,但这应该是一个可以解决的问题。如果您花一些时间阅读 ELF 规范,您可能可以制作一个工具将 .so 文件转换为普通的 .o 文件,然后将 .o 文件包含在 .a 存档中。

    在后一种情况下,大多数人用pkg-config 解决这个问题。另一种与 GNU 相关的方法是安装 GNU 链接器脚本而不是原始的 .a 文件,并让链接器脚本同时引用您的静态库和所需的共享库。

    【讨论】:

    • 我的意思是后者。谢谢,我会研究 pkg-config :)
    【解决方案2】:

    这里的问题是你的动态库是独立于位置编译的,需要一个动态加载器来在加载时修复内部和外部引用。因此,您不能显式链接到动态库。在我正在进行的项目中,我们通常会编译库的静态和动态版本,这就是原因之一。

    【讨论】:

    • 我理解这一点,但是当您将可执行文件链接到动态库时,也需要进行这种动态加载。我的意思不是删除动态加载步骤,而只是将对动态库的引用直接添加到静态库中。然后,如果我们将可执行文件链接到静态库并运行它,则需要解析静态库中对动态库的引用。
    • 这无论如何都不是根本问题。 .so 中面向动态链接的重定位当然可以在静态链接时解决...... PIC 代码没有任何东西可以阻止它被重定位到固定位置。
    【解决方案3】:

    这个问题可以通过使用智能构建系统来解决。我可以推荐使用gyp。它有用于静态库的选项link_settings

    {
      'targets': [
        {
          'target_name': 'x',  # will generate libx.a
          'type': 'static_library',
          'sources': [],
          'link_settings': {
            'libraries': ['-ly'],
          },
        },
        {
          'target_name': 'test',
          'type': 'executable',
          'dependencies': ['x'],
          'sources': [],
        },
      ],
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2010-10-01
      • 2020-01-13
      • 1970-01-01
      • 2010-09-15
      相关资源
      最近更新 更多