[英]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.