gpt4 book ai didi

linker - 如何链接特定库( g++; libstdc++.so.5 和 libstdc++.so.6 )

转载 作者:行者123 更新时间:2023-11-30 23:59:16 27 4
gpt4 key购买 nike

一个简单的问题 - 有没有办法让 g++ 链接器与特定的 libstdc++ 库版本链接?我在 gcc/g++ 的手册页中没有找到任何有用的东西,在这里的其他问题中也没有。

这是这种情况 - 我的应用程序使用一个特定的共享库,它是用 libstdc++.so.5 构建的,我想在 RHEL5 上安装和使用它。因此,当我尝试在 RHEL5 机器上构建应用程序时,我收到了警告:

warning: libstdc++.so.5, needed by ..the_shared_library_.. may conflict with libstdc++.so.6

安装 compat-libstdc++ rpm 没有帮助,由于无能力,程序在 std::string 的析构函数上崩溃。所以,在这个 RHEL5 机器上我有这个:
[root@xxx]# ll /usr/lib/libstd*  
-rwxr-xr-x 1 root root 259532 Aug 21 2006 /usr/lib/libstdc++-3-libc6.2-2-2.10.0.so
lrwxrwxrwx 1 root root 31 Jul 28 19:35 /usr/lib/libstdc++-libc6.2-2.so.3 -> libstdc++-3-libc6.2-2-2.10.0.so
lrwxrwxrwx 1 root root 18 Aug 24 15:08 /usr/lib/libstdc++.so.5 -> libstdc++.so.5.0.7
-rwxr-xr-x 1 root root 733456 Aug 21 2006 /usr/lib/libstdc++.so.5.0.7

当我做
[root@xxxx]# ldd my_exe  
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00333000)
...
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00ddf000)

这很糟糕,因为我知道这是未定义的行为:/

那么,有什么方法可以仅使用 libstdc++.so.5 构建我的可执行文件吗? (由于多种原因,删除 libstdc++.so.6 不是一种选择。静态链接也不是一种选择)。

非常感谢!

最佳答案

这是ABI versions table ; -fabi-version 的默认值开关从 1 变为 2,同时 g++ 在 3.4 中引入了 libstdc++.so.6。这意味着要链接到旧的 libstdc++ 库,您需要

  • 查找并使用等效的 C++ 头文件,而不是编译器附带的头文件
  • 使用 -fabi-version=1 重新编译您的所有代码(以及您正在使用的任何其他 C++ 库)

  • 否则,您将面临 ABI 不兼容的风险。我无法准确地告诉您发生了哪些更改,但一般而言,最好尝试保留使用相同编译器版本编译的所有 C++ 代码。

    假设您不想尝试像这样一起破解事情,我认为您有两个选择:
  • 请您的共享库供应商使用您的 GCC 版本为您重新编译库。这可能不是微不足道的,因为 g++ 3.4 引入了一个新的更严格的 C++ 解析器。
  • 询问您的供应商他们首先使用哪个版本的 g++ 来编译库,然后使用该版本来编译您自己的代码。 RH 可能提供 compat-gcc 编译器以及 libstdc++ - 我不记得了。但是,您还需要所有其他库和操作系统提供的 C++ 库的低级版本,因此可能最容易在具有正确编译器的旧 Red Hat 版本的 VM 上编译。
  • 关于linker - 如何链接特定库( g++; libstdc++.so.5 和 libstdc++.so.6 ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3608010/

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