共享库链接或无法链接到另一个共享库,具体取决于该共享库的名称规范

时间:2019-10-07 07:56:52

标签: gcc shared-libraries dynamic-linking missing-symbols

在我从源代码构建的项目(Nix 2.3 FWIW)中,一个共享库(libnixstore.so)与另一个共享库(libnixutil.so)链接。命令行是:

// Define the main line function
const valueline = d3.line<any>()
.x( (d) => {
  return vm.chartProps.x(d.x);
})
.y( (d) => {
  return vm.chartProps.y(d.y);
});

// Define the area for the confidence intervals function
const confidenceArea = d3.area<any>()
.x( (d) => {
  return vm.chartProps.x(d.x);
})
.y0( (d) => {
  return vm.chartProps.y(d.yt);
})
.y1( (d) => {
  return vm.chartProps.y(d.yb);
});

此命令行是“配置”脚本生成的。但是,这失败了,提示无法从“ libnixutil.so”中找到许多符号。 未解析的符号实际上已经存在,并且进行了正确的处理(我检查了'nm'和'readelf')。 现在,如果我只是将'-lnixutil'替换为'src / libutil / libnixutil.so',链接就可以了。 有什么区别,是否已记录在案?我认为“ man ld”中没有合适的东西,(似乎)没有任何与网络搜索直接相关的东西。

1 个答案:

答案 0 :(得分:1)

  

现在,如果我只是将'-lnixutil'替换为'src / libutil / libnixutil.so',链接就可以了。有什么区别

区别在于-lnuxutil会搜索各种目录中的库,而src/libutil/libnixutil.so不会。

由于使用-lnuxutil时找不到库却无法链接,因此可以安全地假定它在src/libutil之外的其他地方找到了该库的版本,并且找到的版本可能是错误(例如,旧版本)。

要查看链接器在哪里找到libnixutil ,请使用-Wl,-t标志(它将显示所有正在由链接器打开的输入文件)。