使用 Waf 编译时无法正确 link 库
Can't properly link libraries when compiling with Waf
我正在尝试编译一个依赖于 Caffe using Waf 的程序(不是我的程序,只是试图构建它)。在链接期间,我遇到了错误
/usr/bin/ld: cannot find -lcaffe
所以我在 wscript
中将 libcaffe.so
的路径添加到 obj.libpath
并编译。然而,当我 运行 编译后的二进制文件时,我收到一条错误消息,告诉我找不到 libcaffe.so
。怎么可能链接成功了,二进制却找不到库?
How is it possible that linking succeeds, yet the binary can't find the library?
与 /usr/bin/ld
的链接称为静态 linking(不要与完全静态的 linking 混淆,后者通过使用 -static
标志实现)。
当您的库 安装 在系统的标准位置(例如 /usr/lib
)时,一切正常。当您 not 在标准位置安装 libcaffe.so
时,您需要了解(更多)您在做什么。
您可以使用 -L /path/to/dir
linker 标志指示静态 linker 在其他目录中搜索库。这使您可以实现成功的静态 link,并为下一步做好准备...
... 这称为运行时加载。运行时加载由完全不同的程序执行(例如 Linux 上的 /lib/ld-linux.so.2
)。
运行时加载程序再次加载您的程序没有问题,libcaffe.so
如果后者安装在标准位置。但是当它没有安装在标准位置时,需要告诉加载程序在哪里找到libcaffe.so
。有几种特定于系统的方法可以做到这一点。
许多 UNIX 运行时加载程序注意 LD_LIBRARY_PATH
环境变量。
可以将 DT_RUNPATH
或 DT_RPATH
编译到程序本身中,例如-Wl,-rpath=/path/to/dir
或类似的静态 linker 参数。
在某些系统上,可以通过编辑 /etc/ld.so.conf
或 /etc/ld.so.conf.d/...
文件来修改 "system" 位置(默认搜索)。
我正在尝试编译一个依赖于 Caffe using Waf 的程序(不是我的程序,只是试图构建它)。在链接期间,我遇到了错误
/usr/bin/ld: cannot find -lcaffe
所以我在 wscript
中将 libcaffe.so
的路径添加到 obj.libpath
并编译。然而,当我 运行 编译后的二进制文件时,我收到一条错误消息,告诉我找不到 libcaffe.so
。怎么可能链接成功了,二进制却找不到库?
How is it possible that linking succeeds, yet the binary can't find the library?
与 /usr/bin/ld
的链接称为静态 linking(不要与完全静态的 linking 混淆,后者通过使用 -static
标志实现)。
当您的库 安装 在系统的标准位置(例如 /usr/lib
)时,一切正常。当您 not 在标准位置安装 libcaffe.so
时,您需要了解(更多)您在做什么。
您可以使用 -L /path/to/dir
linker 标志指示静态 linker 在其他目录中搜索库。这使您可以实现成功的静态 link,并为下一步做好准备...
... 这称为运行时加载。运行时加载由完全不同的程序执行(例如 Linux 上的 /lib/ld-linux.so.2
)。
运行时加载程序再次加载您的程序没有问题,libcaffe.so
如果后者安装在标准位置。但是当它没有安装在标准位置时,需要告诉加载程序在哪里找到libcaffe.so
。有几种特定于系统的方法可以做到这一点。
许多 UNIX 运行时加载程序注意 LD_LIBRARY_PATH
环境变量。
可以将 DT_RUNPATH
或 DT_RPATH
编译到程序本身中,例如-Wl,-rpath=/path/to/dir
或类似的静态 linker 参数。
在某些系统上,可以通过编辑 /etc/ld.so.conf
或 /etc/ld.so.conf.d/...
文件来修改 "system" 位置(默认搜索)。