Linker 如何与特定库(g+;+;&libstdc+;&x2B;.so.5和libstdc+;&x2B;.so.6)链接

Linker 如何与特定库(g+;+;&libstdc+;&x2B;.so.5和libstdc+;&x2B;.so.6)链接,linker,g++,libstdc++,Linker,G++,Libstdc++,一个简单的问题-有没有办法让g++链接器链接到特定的libstdc++库版本?在gcc/g++的手册页中,我没有发现任何有用的东西,在这里的其他问题中也没有 情况是这样的-我的应用程序使用一个特定的共享库,它是用libstdc++.so.5构建的,我想在RHEL5上安装并使用它。因此,当我尝试在RHEL5机器上构建应用程序时,我得到了警告: warning: libstdc++.so.5, needed by ..the_shared_library_.. may conflict with l

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

非常感谢

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

    <>查找和使用等效的C++头,而不是使用编译器所包含的那些头文件 重新编译所有代码(以及您使用的任何其他C++库),使用<代码> -Fabi版本= 1 < /Calp>
否则,您将面临ABI不兼容的风险。我不能准确地告诉你这些变化是什么,但是一般来说,最好是用同一个编译器版本来编译所有C++代码。 假设您不想尝试将这些东西组合在一起,我认为您有两个选择:

  • 请您的共享库供应商使用您的GCC版本重新编译库。这可能不是微不足道的,因为G+ 3.4引入了一个新的更严格的C++解析器。
  • 询问您的供应商,他们首先使用哪个版本的g++编译库,然后使用该版本编译您自己的代码。RH可能会提供compat-gcc编译器以及libstdc++,我记不得了。但是,您还需要使用您所使用的C++库的所有其他库和OS的下级版本,因此,在具有合适编译器的旧红帽版本的VM上编译可能最容易。

  • 好吧,我试过第一种选择,但还是没有。。我还在那里等待帮助,所以我不认为他们会重新编译这个库。关于第二个——我需要在RHEL5机器上使用该应用程序,所以我不需要旧的OS库,只需要libstdc++。如果他们告诉我他们用于编译oracle库(OCCI 10.2.0.3)的gcc版本,我将使用RHEL5和特定的gcc版本创建一个虚拟机。希望这会有所帮助:/感谢您的回复!BR,kirill很抱歉,这没用:-/必要时,您可以为libstdc++.so.5代码运行一个单独的进程,并使用IPC在两者之间传递数据。甚至可以用旧的GCC编写C包装库,并将其链接到新代码中,所以在这两个之间没有C++边界,但是您必须非常小心地注意那里的链接链接。不幸的是,我没有时间为这个问题实现它,但这对其他应用程序确实有帮助。非常有趣的想法。谢谢你好!我只是想告诉你这个问题已经解决了,是的,Rup,你是对的。解决这个问题的方法是使用gcc 3.4.3,而不是3.2.3(:感谢您的帮助!祝您好运,Kiril Kirov