我想在覆盆子pi 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中找到合适的库?
发布于 2021-10-19 02:15:48
只需确保先考虑新版本的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之前(一个文件包含两次也没关系):
include /etc/ld.so.conf.d/gcc-11.2.0.conf
include /etc/ld.so.conf.d/*.conf在使用/etc/ld.so.conf.d中的文件时,还可以使用数字前缀控制includes的顺序。在这种情况下,将文件重命名为/etc/ld.so.conf/00-gcc-11.2.0.conf将强制ldconfig在处理目录中的任何其他文件之前处理它。
https://stackoverflow.com/questions/69609762
复制相似问题