咖啡找不到 libboost_system.so.166.0
caffe can't find libboost_system.so.166.0
我正在使用 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
?
你的 /usr/local/lib/libboost_system.so.1.66.0
显然是你建造的
你自己并希望加载程序在 运行 时间找到而无需采取特殊措施。
但是构建之后,您没有更新 ldconfig 缓存
(因为你不知道你必须这样做);所以 运行time loader 还不知道这个
库存在但找不到它。
当加载程序正在寻找 assemble 新进程所需的共享库时,
它不会搜索链接器的所有默认搜索目录。那会很慢。
默认情况下,它会搜索缓存的数据库 /etc/ld.so.cache
,其中包含
由 ldconfig
找到,上次是 运行。
默认情况下,ldconfig
缓存它在 /lib
、/usr/lib
和目录中找到的库
在文件 /etc/ld.so.conf
、and/or 中列出了在 /etc/ld.so.conf
中递归 include
编辑的任何类似 *.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
作为根用户。您需要在安装新的本地构建的任何时候做同样的事情
/usr/local/lib
中的共享库。
如果您希望加载程序找到一个不在 ldconfig
中的共享库 /a/b/libfoo.so
缓存,您可以通过将 /a/b/libfoo.so
附加到
启动环境中的环境变量 LD_LIBRARY_PATH
(默认情况下为空)
需要加载该库的进程。加载程序将搜索 LD_LIBRARY_PATH
ldconfig
缓存之前的目录(如果有)。但是,不 添加共享库
ldconfig
缓存应该是一个明智的选择和设置 LD_LIBRARY_PATH
当然,仅仅由于对 ldconfig
设备或链接器的 -rpath
option
的无知并没有很好的动机
我正在使用 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
?
你的 /usr/local/lib/libboost_system.so.1.66.0
显然是你建造的
你自己并希望加载程序在 运行 时间找到而无需采取特殊措施。
但是构建之后,您没有更新 ldconfig 缓存 (因为你不知道你必须这样做);所以 运行time loader 还不知道这个 库存在但找不到它。
当加载程序正在寻找 assemble 新进程所需的共享库时,
它不会搜索链接器的所有默认搜索目录。那会很慢。
默认情况下,它会搜索缓存的数据库 /etc/ld.so.cache
,其中包含
由 ldconfig
找到,上次是 运行。
默认情况下,ldconfig
缓存它在 /lib
、/usr/lib
和目录中找到的库
在文件 /etc/ld.so.conf
、and/or 中列出了在 /etc/ld.so.conf
中递归 include
编辑的任何类似 *.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
作为根用户。您需要在安装新的本地构建的任何时候做同样的事情
/usr/local/lib
中的共享库。
如果您希望加载程序找到一个不在 ldconfig
中的共享库 /a/b/libfoo.so
缓存,您可以通过将 /a/b/libfoo.so
附加到
启动环境中的环境变量 LD_LIBRARY_PATH
(默认情况下为空)
需要加载该库的进程。加载程序将搜索 LD_LIBRARY_PATH
ldconfig
缓存之前的目录(如果有)。但是,不 添加共享库
ldconfig
缓存应该是一个明智的选择和设置 LD_LIBRARY_PATH
当然,仅仅由于对 ldconfig
设备或链接器的 -rpath
option