更新时间:2023-02-02 21:18:05
以下是 ABI版本表; g ++开关的默认值从1变为2,同时g ++引入了3.4中的libstdc ++。so.6。这意味着要链接到较旧的libstdc ++库,您需要
-fabi-version = 1
否则您将面临ABI不兼容的风险。我无法准确告诉你所做的修改是什么,但总的来说,***尝试使用相同的编译器版本来保存所有已编译的C ++代码。
假设你不喜欢我想你有两个选择:
A simple question - is there any way to make the g++
linker to link with a specific libstdc++
library version? I didn't find anything useful in the man page of gcc
/g++
, neither in other questions here.
Here's the situation - my application uses a specific shared library, that's built with libstdc++.so.5
and I want to install and use it on RHEL5
. So, when I try to build the application on a RHEL5
machine, I got the warning:
warning: libstdc++.so.5, needed by ..the_shared_library_.. may conflict with libstdc++.so.6
Installing a compat-libstdc++
rpm didn't help, the program crashes on a destructor of std::string
, because of the incapability. So, on this RHEL5
machine I have this:
[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
and when I make
[root@xxxx]# ldd my_exe
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00333000)
...
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00ddf000)
which is bad, as I know it's undefined behavior :/
So, is there any way to build my executable using only libstdc++.so.5
? (removing libstdc++.so.6
is not an option because of many reasons. Static linking is not an option, too ).
Thanks a lot!
Here's the ABI versions table; the default value for the -fabi-version
switch changed from 1 to 2 at the same time g++ introduced libstdc++.so.6 with 3.4. This means that to link against the older libstdc++ library you would need to
-fabi-version=1
otherwise you run the risk of ABI incompatibilities. I can't tell you precisely what the changes were but in general it's best to try and keep all C++ code you have compiled with the same compiler version.
Assuming you don't want to try and hack things togther like this I think you have two choices: