你如何指定库的位置到二进制文件?(Linux)

Mal*_*ala 39 linux libraries

对于这个问题,我将使用一个具体的例子,但实际上这可以推广到几乎任何似乎无法找到其依赖库的 linux 二进制文件。所以,我有一个由于缺少库而无法运行的程序:

./cart5: error while loading shared libraries: libcorona-1.0.2.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

ldd 阐明了这个问题:

linux-vdso.so.1 =>  (0x00007fff18b01000)
libcorona-1.0.2.so => not found
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/libstdc++.so.6 (0x00007f0975830000)
libm.so.6 => /lib/libm.so.6 (0x00007f09755af000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f0975399000)
libc.so.6 => /lib/libc.so.6 (0x00007f0975040000)
libz.so.1 => /lib/libz.so.1 (0x00007f0974e2b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0975b36000)
Run Code Online (Sandbox Code Playgroud)

但是,安装了电晕:

oliver@human$ find / -name libcorona-1.0.2.so 2> /dev/null

/usr/local/lib64/libcorona-1.0.2.so
/home/oliver/installed/corona-1.0.2/src/.libs/libcorona-1.0.2.so
Run Code Online (Sandbox Code Playgroud)

我如何告诉二进制文件在哪里寻找“丢失”的库?

Gil*_*il' 49

对于一次性,将变量设置为LD_LIBRARY_PATH要搜索的以冒号分隔的目录列表。这类似于PATH可执行文件,除了在通过环境指定的目录之后额外搜索标准系统目录。

LD_LIBRARY_PATH=/usr/local/lib64 ./cart5
Run Code Online (Sandbox Code Playgroud)

如果您的程序将库保存在非标准位置并且无法自行找到它们,您可以编写一个包装脚本:

#!/bin/sh
if [ -n "$LD_LIBRARY_PATH" ]; then
  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
else
  LD_LIBRARY_PATH=/usr/local/lib64
fi
export LD_LIBRARY_PATH
exec /path/to/cart5 "$@"
Run Code Online (Sandbox Code Playgroud)

标准系统目录列表保存在/etc/ld.so.conf. 最近的系统允许此文件包含其他文件;如果您的文件包含类似的内容include /etc/ld.so.conf.d/*.conf,请创建一个名为的新文件,/etc/ld.so.conf.d/mala.conf其中包含您要添加的目录。更改/etc/ld.so.conf或包含文件后,运行/sbin/ldconfig以使更改生效(这会更新缓存)。

LD_LIBRARY_PATH也适用于许多其他 unice,包括 FreeBSD、NetBSD、OpenBSD、Solaris 和 Tru64。HP-UXSHLIB_PATH和 Mac OS X 都有DYLD_LIBRARY_PATH/etc/ld.so.conf在大多数 unice 上都有类似物,但位置和语法差异更大。)


tts*_*ras 16

如果您想避免 LD_LIBRARY_PATH,您也可以在链接期间执行此操作:

gcc -o exename -L/path/to/dynamiclib/ -lnameofLib \
    -Wl,-R/path/to/dynamiclib/ sourceCode1.c ...
Run Code Online (Sandbox Code Playgroud)

-Wl,... 用于将额外的命令传递给链接器,在这种情况下,使用 -R 可以告诉链接器将此路径存储为 .so 的“默认搜索路径”。

我在我的网站上记录了许多像这样的小技巧:

https://www.thanassis.space/tricks.html