4

一个简单的问题 - 有没有办法让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不是一种选择。静态链接也不是一种选择)。

非常感谢!

4

1 回答 1

5

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

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

否则您将面临 ABI 不兼容的风险。我无法准确地告诉您更改是什么,但一般来说,最好尝试保留您使用相同编译器版本编译的所有 C++ 代码。

假设您不想像这样尝试破解事物,我认为您有两个选择:

  1. 请您的共享库供应商使用您的 GCC 版本为您重新编译库。这可能不是微不足道的,因为 g++ 3.4 引入了一个新的更严格的 C++ 解析器。
  2. 询问您的供应商他们首先使用哪个版本的 g++ 来编译库,然后使用该版本来编译您自己的代码。RH 可能会提供 compat-gcc 编译器以及 libstdc++ - 我不记得了。但是,您还需要您正在使用的所有其他库和操作系统提供的 C++ 库的低级版本,因此在具有正确编译器的旧 Red Hat 版本的 VM 上编译可能是最容易的。
于 2010-08-31T10:29:45.097 回答