gpt4 book ai didi

gcc - 为什么/usr/lib64 不在 ld.so 的默认位置?

转载 作者:行者123 更新时间:2023-12-04 10:13:22 40 4
gpt4 key购买 nike

昨天,我尝试通过从源代码构建的方式将我的 gcc 从版本 8.4.0 升级到 9.3.0,因为可以通过 Ubuntu 的 apt repo 安装的最新版本是 8.4.0。

构建和安装过程都可以,我可以编译任何 c++ 代码,即使包括那些仅由 gcc-9.3.0 实现的功能。
但是我不能运行我的程序,如果我在我的代码中使用了 c++ STL。

通过“ldd my-program”,我发现了问题。
看起来 gcc-9.3.0 安装了文件 libstdc++.so.6.0.28 进入 /usr/lib64/ , 而正式版 (gcc-8.4.0) 的 ( libstdc++.so.6.0.25 ) 位于 /usr/lib/x86_64-linux-gnu/ , 所以 ld.so 不能为我的程序加载库。
如果我将“/usr/lib64”添加到 LD_LIBRARY_PATH 环境变量,它的工作原理。

奇怪的是/usr/lib64 不是 Kubuntu-18.04.4LTS 的 ld.so 的默认搜索位置之一,还是我错了?

我知道它可以通过使用 LD_LIBRARY_PATH 或将路径添加到/etc/ld.so.conf 来解决,我只是想知道/usr/lib64 不是默认路径。

此外,我回顾了构建过程:

为了使目标尽可能接近来自 Ubuntu apt 存储库的官方目标,
在配置之前,我使用“echo | gcc -v -x c -E -”来获取官方 gcc-8.4.0 目标的所有构建选项,
然后将它们应用到我自己的建筑中,如下所示:

~/projects/gcc-9.3.0/configure \
--build=x86_64-linux-gnu \
--disable-libgcj \
--disable-libstdcxx-debug \
--disable-libunwind-exceptions \
--disable-multilib \
--disable-vtable-verify \
--enable-__cxa_atexit \
--enable-bootstrap \
--enable-checking=release \
--enable-clocale=gnu \
--enable-default-pie \
--enable-gnu-indirect-function \
--enable-gnu-unique-object \
--enable-initfini-array \
--enable-languages=c,c++ \
--enable-libmpx \
--enable-libstdcxx-time=yes \
--enable-linker-build-id \
--enable-nls \
--enable-offload-targets=nvptx-none \
--enable-plugin \
--enable-shared \
--enable-threads=posix \
--host=x86_64-linux-gnu \
--libdir=/usr/lib \
--libexecdir=/usr/lib \
--prefix=/usr \
--program-suffix=-9.3 \
--target=x86_64-linux-gnu \
--with-abi=m64 \
--with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs \
--with-default-libstdcxx-abi=new \
--with-linker-hash-style=gnu \
--with-pkgversion='Ubuntu 9.3.0-6ubuntu1~18.04.4' \
--with-system-zlib \
--with-target-system-zlib \
--with-tune=generic \
--without-cuda-driver \
--without-included-gettext

请注意选项“--libdir=/usr/lib”明确设置了目标库的安装路径。
但最终还是将文件 libstdc++.so.6.0.28 安装到了/usr/lib64。

我错过了什么?

任何帮助或提示将被appretiated!

最佳答案

并非所有 Debian/Ubuntu 多架构补丁都已集成到上游 GNU 工具链中。如果要构建与系统其余部分兼容的工具链,则必须手动应用它们。见 debian/patches/gcc-multiarch.diffdebian/patches/gcc-multilib-multiarch.diffgcc-9源包。

使用 /usr/lib而不是 /usr/lib64在动态加载器中,除了多架构路径之外,还返回到多架构之前的 Debian 端口(例如 Debian 6.0 挤压)和原始 amd64 端口。关于这个问题,有一个非常古老的错误报告和邮件列表讨论:

  • amd64 system not compliant with FHS
  • Compatibility between Debian amd64 and other distributions

  • 似乎当时无法为即将发布的 Debian 版本修复此问题,并且后来卡住了。 (对不起,我不记得细节了。)

    关于gcc - 为什么/usr/lib64 不在 ld.so 的默认位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61205491/

    40 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com