咖啡找不到 libboost_system.so.166.0

caffe can't find libboost_system.so.166.0

我正在使用 boost 1.66 在 Ubuntu 17.04 系统上安装 caffe。我能够毫无问题地执行 make allmake 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

的无知并没有很好的动机