【问题标题】:Why does ldd fail to find libstdc++ in /usr/local/lib64 without LD_LIBRARY_PATH?为什么 ldd 在没有 LD_LIBRARY_PATH 的情况下无法在 /usr/local/lib64 中找到 libstdc++?
【发布时间】:2021-12-05 03:16:34
【问题描述】:

我想在树莓派 4b 上运行使用 gcc-11 编译的程序,而无需指定 LD_LIBRARY_PATH 或链接库路径。

目前,如果我必须在 LD_LIBRARY_PATH 中指定新 libstdc++ 的路径,否则 ld 无法加载正确的库:

pi@cm4:~ $ ./rckam-server --version
./rckam-server: /lib/aarch64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.13' not found (required by ./rckam-server)
./rckam-server: /lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by ./rckam-server)
./rckam-server: /lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by ./rckam-server)
pi@cm4:~ $ LD_LIBRARY_PATH=/usr/local/lib64 ./rckam-server --version
rckam-server version 0.2021.08.23-a5d7a165
pi@cm4:~ $

我正在运行 Raspberry Pi OS 64 位(debian 10.11)。在构建和安装 gcc 11.2.0 之后,我创建了 /etc/ld.so.conf.d/gcc-11.2.0.conf:

pi@cm4:/etc $ cat ld.so.conf.d/gcc-11.2.0.conf
/usr/local/libexec/gcc/aarch64-unknown-linux-gnu/11.2.0
/usr/local/lib64

pi@cm4:/etc $

运行 ldconfig 后,我验证缓存包含相关库:

pi@cm4:/etc $ ldconfig -p | grep libstdc++
    libstdc++.so.6 (libc6,AArch64) => /lib/aarch64-linux-gnu/libstdc++.so.6
    libstdc++.so.6 (libc6,AArch64) => /usr/local/lib64/libstdc++.so.6
    libstdc++.so (libc6,AArch64) => /usr/local/lib64/libstdc++.so
pi@cm4:/etc $ ldconfig -p | grep liblto
    liblto_plugin.so (libc6,AArch64) => /usr/local/libexec/gcc/aarch64-unknown-linux-gnu/11.2.0/liblto_plugin.so
pi@cm4:/etc $

这是编译器:

pi@cm4:/etc $ gcc-11 -v
Using built-in specs.
COLLECT_GCC=gcc-11
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/aarch64-unknown-linux-gnu/11.2.0/lto-wrapper
Target: aarch64-unknown-linux-gnu
Configured with: ../gcc-11.2.0/configure -v --enable-languages=c,c++ --program-suffix=-11 --with-cpu=cortex-a72
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.2.0 (GCC)

我还应该怎么做才能让 ld 在 /usr/local/lib64 中找到合适的库?

【问题讨论】:

    标签: gcc raspberry-pi ld ldd


    【解决方案1】:

    只需确保在旧版本之前考虑新版本的 libstdc++。这正是指定 LS_LIBRARY_PATH 时发生的情况。

    “ldconfig -p | grep libstdc++”的输出在 /lib/aarch64-linux-gnu/libstdc++.so.6 之后列出了 /usr/local/lib64/libstdc++.so.6,这就是问题所在。这是因为文件 /etc/ld.so.conf.d/aarch64-linux-gnu.conf 在 /etc/ld.so.conf.d/gcc-11.0.2.conf 之前由 ldconfig 处理。

    有几种方法可以控制 ldconfig 处理目录的顺序。第一种是老式方法:直接在 /etc/ld.so.conf 中按所需顺序列出目录,而不是使用 gcc-11.2.0.conf。像这样的:

    /usr/local/libexec/gcc/aarch64-unknown-linux-gnu/11.2.0
    /usr/local/lib64
    include /etc/ld.so.conf.d/*.conf
    

    文件 gcc-11.2.0.conf 可以在通用包含之前显式包含(文件是否包含两次无关紧要):

    include /etc/ld.so.conf.d/gcc-11.2.0.conf
    include /etc/ld.so.conf.d/*.conf
    

    使用 /etc/ld.so.conf.d 中的文件时,还可以使用数字前缀控制包含的顺序。在这种特定情况下,将文件重命名为 /etc/ld.so.conf/00-gcc-11.2.0.conf 将强制 ldconfig 在目录中的任何其他文件之前处理它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 2012-05-07
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      相关资源
      最近更新 更多