将动态库链接到一个静态库(又名预链接动态库)

问题描述:

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

这基本上允许我在编译程序的时候不指定选项-ly当-lx存在。与libx链接时,这使得事情更简单,特别是如果依赖于许多共享库。

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

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

我很困惑你是否真的想将共享库代码包含到静态库存档中,或者是否只想将其合并到静态库中,并自动创建对共享库的引用。

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

在后一种情况下,大多数人用pkg-config来解决这个问题。另一种方法是GNU特定的,它将安装一个GNU链接描述文件而不是原始的.a文件,并让链接描述文件引用你的静态库和所需的共享库。

+0

我的意思是后者。谢谢,我会看看pkg-config :) – Norswap

这里的问题是,你的动态库是编译位置无关的,需要一个动态加载器来在加载时修复内部和外部引用。因此你不能显式链接到一个动态库。在我正在研究的项目中,我们通常编译库的静态和动态版本,这是其中一个原因。

+0

我明白这一点,但是当你对一个动态链接库的可执行文件,该动态负载也需要发生。 我的意思是不删除动态加载步骤,而只是直接将动态库的引用添加到静态库。然后,如果我们将可执行文件与静态库链接并运行,则需要解析静态库中对动态库的引用。 – Norswap

+0

这不是一个基本的问题。 '.so'中面向动态链接的重定位当然可以在静态链接时解决......没有任何关于PIC代码阻止它重新定位到固定位置的问题。 –

该问题可以通过使用智能构建系统来解决。我可以推荐使用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': [], 
    }, 
    ], 
}