繁体   English   中英

将动态库链接到 static 库(又名预链接动态库)

[英]Linking a dynamic library into a static library (aka pre-linking a dynamic library)

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

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

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

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

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

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

在后一种情况下,大多数人使用pkg-config解决这个问题。 另一种特定于 GNU 的方法是安装 GNU linker 脚本而不是原始.a文件,并让 linker 脚本同时引用您的 ZA81259CEF8E959C6247DF1D456EZ53 库和所需的共享库。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM