我使用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'.
但是,当我尝试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
现在,我知道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
并且,在caffe的Makefile.config
中,/usr/local/lib
位于图书馆路径上:
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
那么,我在这里错过了什么?如何确保caffe
知道在哪里找到libboost_system.so.1.66.0
?
答案 0 :(得分:5)
你的/usr/local/lib/libboost_system.so.1.66.0
显然是你建造的
你自己并希望加载器在运行时找到而无需特殊措施。
但是在构建它之后,您没有更新ldconfig缓存 (因为你不知道你必须这样做);所以运行时加载器还没有意识到这一点 库存在,无法找到它。
当加载程序正在寻找组装新进程所需的共享库时,
它不会搜索所有链接器的默认搜索目录。那会很慢。
默认情况下,它会搜索已缓存的数据库/etc/ld.so.cache
由ldconfig
发现,上次运行时。
默认情况下,ldconfig
会缓存它在/lib
,/usr/lib
和目录中找到的库
文件/etc/ld.so.conf
中列出的文件和/或*.conf
中递归include
的任何类似/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
您看到/usr/local/lib
列在那里。所以,要让加载器知道
您的新/usr/local/lib/libboost_system.so.1.66.0
,只需运行:
ldconfig
以root身份。您需要在安装新的本地构建时执行此操作
/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
option