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

Kir*_*rov 4 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
Run Code Online (Sandbox Code Playgroud)

安装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  
Run Code Online (Sandbox Code Playgroud)

当我做的时候

[root@xxxx]# ldd my_exe  
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00333000)  
...  
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00ddf000)
Run Code Online (Sandbox Code Playgroud)

哪个不好,因为我知道这是未定义的行为:/

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

非常感谢!

Rup*_*Rup 5

这是ABI版本表 ; -fabi-version交换机的默认值从1改为2,同时g ++引入了libstdc ++.so.6 with 3.4.这意味着要链接到您需要的旧libstdc ++库

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

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

假设你不想尝试和其他东西这样做,我认为你有两个选择:

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