30

我正在 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

然后我在二进制文件上运行 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)

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

4

4 回答 4

32

找不到库。

默认情况下在 中查找库/lib/usr/lib并在 指定的目录中查找/etc/ld.so.conf

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

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

LD_LIBRARY_PATH="your/boost/directory" ./testfgci

我建议你使用包管理器安装 boost 库,无论如何,这会让你的生活变得更简单。

于 2011-01-03T00:53:21.307 回答
29

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

于 2012-03-02T03:19:30.247 回答
7

我只是想为 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

它适用于~/.bashrc,但仅为这个特定的交互式 shell 设置路径。这意味着如果您make从 eg emacsor调用eclipse,它将不起作用,除非您emacs是从 shell 而不是从启动器启动的。

这对我有用:

echo -e "\n/usr/local/boost_1_54_0/stage/lib" | sudo tee -a /etc/ld.so.conf 
sudo ldconfig
于 2013-07-09T12:54:34.713 回答
1

正如peoro他的回答中提到的,使用包管理器安装它。例如,如果您使用的是 Ubuntu 18.04,请运行

sudo apt install libboost-filesystem1.65.1
于 2021-03-10T13:12:46.063 回答