加载共享库时出错:libboost_system.so.1.45.0:无法打开共享对象文件:没有这样的文件或目录

sky*_*gle 24 c++ linux ubuntu ld ldd

我正在Linux上构建C++可执行文件.可执行文件链接到一些boost库.

这是我尝试运行二进制文件时的输出:

root@yourbox:~/work/dev/c++/projects/testfgci/dist/Debug/GNU-Linux-x86$ ./testfgci 
./testfgci: error while loading shared libraries: libboost_system.so.1.45.0: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

然后我在二进制文件上运行ldd来检查依赖项:

root@yourbox:~/work/dev/c++/projects/testfgci/dist/Debug/GNU-Linux-x86$ ldd testfgci 
    linux-gate.so.1 =>  (0x00380000)
    libboost_system.so.1.45.0 => not found
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00b50000)
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x005f6000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0099a000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x001b3000)
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00110000)
    /lib/ld-linux.so.2 (0x00ea2000)
Run Code Online (Sandbox Code Playgroud)

我不确定为什么找不到liboos_system.sl.1.45.0 SO.我今天早些时候成功地建造了它.谁能解释一下?

peo*_*oro 26

找不到图书馆.

默认情况下会查找库/lib,/usr/lib以及指定的目录/etc/ld.so.conf.

通常系统库(如boost,如果你通过包管理器安装它)位于/usr/lib,但它可能不是你的情况.

您的升级库位于您的系统中的哪个位置?你自己编译了吗?在这种情况下,您应该告诉动态链接器使用LD_LIBRARY_PATH环境变量在它们所在的目录中查找您的库:

LD_LIBRARY_PATH="your/boost/directory" ./testfgci
Run Code Online (Sandbox Code Playgroud)

我建议您使用包管理器安装boost库,无论如何,这将使您的生活更加简单.


ont*_*tek 20

我知道这是一个旧的,但你可以运行ldconfig来重建你的ld缓存.这样你就不需要更新了LD_LIBRARY_PATH.


abo*_*abo 5

我只是想为Ubuntu(和Debian,我猜)的用户添加一个注释:这些系统有一个安全"功能"可以删除LD_LIBRARY_PATH.这不起作用:

在任何一个/etc/environemnt~/.profile~/.bash_profile:

export LD_LIBRARY_PATH=/usr/local/boost_1_54_0/stage/lib:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

它将起作用~/.bashrc,但路径将仅为此特定交互式shell设置.这意味着如果你make从eg emacs或者调用eclipse它,它将无法工作,除非你emacs从shell 启动而不是从启动器启动.

这对我有用:

echo -e "\n/usr/local/boost_1_54_0/stage/lib" | sudo tee -a /etc/ld.so.conf 
sudo ldconfig
Run Code Online (Sandbox Code Playgroud)