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

标签 c++ build linker shared-libraries waf

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

/usr/bin/ld: 找不到 -lcaffe

所以我将libcaffe.so 的路径添加到wscript 中的obj.libpath 并编译。然而,当我运行编译后的二进制文件时,我收到一条错误消息,提示我找不到 libcaffe.so。怎么可能链接成功了,二进制却找不到库?

最佳答案

How is it possible that linking succeeds, yet the binary can't find the library?

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

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

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

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

如果 libcaffe.so 安装在标准位置,则运行时加载程序再次加载您的程序和 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/... 文件。

关于c++ - 使用 Waf 编译时无法正确链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30314487/

相关文章:

c - 具有依赖关系的类似 Arduino 的 Makefile ......?

dynamic - 如何区分 .data.rel 部分中的可重定位符号和不可重定位符号

c++ - 链接与包含文件

javascript - C++逻辑表达式优化

c++ - 将奇异对齐的对象置于协程状态是否是定义的行为?

c++ - ActiveMQ C++ 同步客户端

c# - 发布输出文件夹中的程序调试数据库文件

ios - 从 Jenkins 构建失败

c++ - 由于 undefined symbol ,无效的 MEX 文件

c++ - 如何获取点 vector 并仅获取这些点中的 'y'