在使用Waf编译时无法正确链接库

时间:2015-05-18 23:39:28

标签: c++ build linker shared-libraries waf

我尝试使用Caffe编译依赖于Waf的程序(不是我的程序,只是尝试构建它)。在链接期间,我收到了错误

/usr/bin/ld: cannot find -lcaffe

所以我在libcaffe.so中添加了obj.libpathwscript的路径并进行了编译。然而,当我运行已编译的二进制文件时,我收到一个错误,告诉我它无法找到libcaffe.so。链接怎么可能成功,但二进制文件无法找到库?

1 个答案:

答案 0 :(得分:2)

  

链接怎么可能成功,但二进制文件找不到库?

/usr/bin/ld链接就是所谓的静态链接(不要与使用-static标志实现的全静态链接混淆。)

当你的库安装在系统的标准位置时(例如在/usr/lib中),一切正常。当你在标准的地方安装libcaffe.so时,你需要知道(更多)你在做什么。

您可以使用-L /path/to/dir链接器标志指示静态链接器搜索库的其他目录。这使您可以实现成功的静态链接,并为下一步做好准备......

...这称为运行时加载。运行时加载由完全不同的程序执行(例如Linux上的/lib/ld-linux.so.2)。

如果后者安装在标准位置,则运行时加载程序再次加载程序并没有问题libcaffe.so。但是当它没有安装在标准位置时,需要告诉加载器在哪里找到libcaffe.so。有几种特定于系统的方法。

许多UNIX运行时加载器都关注LD_LIBRARY_PATH环境变量。

可以将DT_RUNPATHDT_RPATH编译到程序本身,例如-Wl,-rpath=/path/to/dir或类似的静态链接器参数。

在某些系统上,可以通过编辑/etc/ld.so.conf/etc/ld.so.conf.d/...文件来修改“系统”位置(默认搜索)。