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

Can't properly link libraries when compiling with Waf

本文关键字:链接 Waf 编译 使用      更新时间:2023-10-16

我正在尝试编译一个依赖于 Waf 的 Caffe 的程序(不是我的程序,只是试图构建它(。在链接过程中,我收到错误

/usr/bin/ld: cannot find -lcaffe

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

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

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

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

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

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

运行时加载程序再次加载程序没有问题,如果后者安装在标准位置,则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/...文件来修改"系统"位置(默认情况下搜索

(。