use*_*262 2 boost shared-libraries caffe
我正在使用Boost 1.66在Ubuntu 17.04系统上安装caffe。我能够执行make all并且make test没有问题:
me@icvr1:~/PackageDownloads/caffe$ make all
make: Nothing to be done for 'all'.
me@icvr1:~/PackageDownloads/caffe$ make test
make: Nothing to be done for 'test'.
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试时make runtest,出现以下错误:
me@icvr1:~/PackageDownloads/caffe$ make runtest
.build_release/tools/caffe
.build_release/tools/caffe: error while loading shared libraries: libboost_system.so.1.66.0: cannot open shared object file: No such file or directory
Makefile:532: recipe for target 'runtest' failed
make: *** [runtest] Error 127
Run Code Online (Sandbox Code Playgroud)
现在,我知道libboost_system.so.1.66.0存在于/usr/local/lib中(我认为)是一个相当标准的位置:
me@icvr1:~/PackageDownloads/caffe$ ls /usr/local/lib/libboost_system*
/usr/local/lib/libboost_system.a /usr/local/lib/libboost_system.so /usr/local/lib/libboost_system.so.1.66.0
Run Code Online (Sandbox Code Playgroud)
并且,在caffe中Makefile.config,/usr/local/lib位于库路径中:
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
Run Code Online (Sandbox Code Playgroud)
那么,我在这里想念什么?我如何确保caffe知道在哪里找到libboost_system.so.1.66.0?
您/usr/local/lib/libboost_system.so.1.66.0显然是您自己构建的,希望加载程序在运行时查找时无需采取特殊措施。
但是在构建它之后,您没有更新ldconfig高速缓存(因为您不知道必须这样做)。因此,运行时加载程序尚未意识到该库存在并且无法找到它。
当加载程序正在寻找组装新进程所需的共享库时,它不会搜索链接程序的所有默认搜索目录。那太慢了。默认情况下,它搜索上次运行时/etc/ld.so.cache由所找到的库的缓存数据库ldconfig。
默认情况下,ldconfig缓存库先找到/lib,/usr/lib并在文件中列出的directrories /etc/ld.so.conf,和/或任何类似*.conf的是递归的文件include中-ed /etc/ld.so.conf。例如:
$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
$ cat /etc/ld.so.conf.d/*.conf
/usr/lib/x86_64-linux-gnu/libfakeroot
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/nvidia-384
/usr/lib32/nvidia-384
/usr/lib/nvidia-384
/usr/lib32/nvidia-384
# Legacy biarch compatibility support
/lib32
/usr/lib32
Run Code Online (Sandbox Code Playgroud)
您看到/usr/local/lib那里列出了。因此,要使加载程序知道您的new /usr/local/lib/libboost_system.so.1.66.0,只需运行:
ldconfig
Run Code Online (Sandbox Code Playgroud)
作为根。每当您在中安装新的本地构建的共享库时,都需要这样做/usr/local/lib。
如果您希望加载程序查找/a/b/libfoo.so不在ldconfig
缓存中的共享库,则可以通过在/a/b/libfoo.so以下环境中附加到环境变量的值LD_LIBRARY_PATH(默认情况下为空)的特殊措施来做到这一点:您启动需要加载该库的过程。加载程序将LD_LIBRARY_PATH
在ldconfig缓存之前搜索目录(如果有)。但是,不将共享库添加到ldconfig缓存应该是明智的选择LD_LIBRARY_PATH
,当然,仅由于对ldconfig设备或链接器选项的了解不充分,无法很好地进行设置-rpath
| 归档时间: |
|
| 查看次数: |
4213 次 |
| 最近记录: |