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

时间:2010-08-31 10:09:24

标签: linker g++ libstdc++

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

非常感谢!

1 个答案:

答案 0 :(得分:5)

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

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

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

假设你不想试图破解这样的东西我认为你有两个选择:

  1. 请求您的共享库供应商为您重新编译包含您的GCC版本的库。这可能并不简单,因为g ++ 3.4引入了一个新的更严格的C ++解析器。
  2. 询问您的供应商,他们首先使用哪个版本的g ++编译库,并使用该版本编译您自己的代码。 RH可能提供compat-gcc编译器以及libstdc ++ - 我不记得了。但是,您还需要使用所有其他库和操作系统提供的C ++库的低级版本,因此最简单的方法是在具有正确编译器的旧版Red Hat版本的VM上进行编译。