【问题标题】:caffe can't find libboost_system.so.166.0caffe 找不到 libboost_system.so.166.0
【发布时间】:2018-07-18 10:14:26
【问题描述】:

我正在使用 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?

【问题讨论】:

标签: boost shared-libraries caffe


【解决方案1】:

您的/usr/local/lib/libboost_system.so.1.66.0 显然是您构建的 自己并希望加载程序在运行时找到而无需特殊措施。

但是在构建它之后,您并没有更新 ldconfig 缓存 (因为你不知道你必须这样做);所以运行时加载器还不知道这个 库存在,但找不到。

当加载器正在寻找组装新进程所需的共享库时, 它不会搜索链接器的所有默认搜索目录。那会很慢。 默认情况下,它会搜索缓存的数据库/etc/ld.so.cache,其中的库是 由ldconfig 找到,上次运行。

默认情况下,ldconfig 缓存它在/lib、/usr/lib 和目录中找到的库 在/etc/ld.so.conf 文件中列出,和/或在/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 的无知而没有很好的动机

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2017-03-01
    • 1970-01-01
    • 2018-11-08
    • 2017-12-05
    • 2015-08-22
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多