我尝试使用Caffe编译依赖于Waf的程序(不是我的程序,只是尝试构建它)。在链接期间,我收到了错误
/usr/bin/ld: cannot find -lcaffe
所以我在libcaffe.so
中添加了obj.libpath
到wscript
的路径并进行了编译。然而,当我运行已编译的二进制文件时,我收到一个错误,告诉我它无法找到libcaffe.so
。链接怎么可能成功,但二进制文件无法找到库?
答案 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_RUNPATH
或DT_RPATH
编译到程序本身,例如-Wl,-rpath=/path/to/dir
或类似的静态链接器参数。
在某些系统上,可以通过编辑/etc/ld.so.conf
或/etc/ld.so.conf.d/...
文件来修改“系统”位置(默认搜索)。