これら 2 つの GCC バージョンの ABI は互換性があります。問題は、GCC 4.6 によってコンパイルされたオブジェクトが、新しい GCC の C++ 標準ライブラリによってのみ定義されているシンボルに依存する可能性があることです (たとえば、オブジェクトをstd::fstream
取得するコンストラクターを使用する場合、依存関係があります)。std::string
これは、C++11 をサポートする GCC の最近のバージョンにのみ存在します。)
libstdc++.so.6.0.16
GCC 4.6(つまり)からlibstdc ++にリンクしている限り、つまり次のようにリンクしている限り機能します-L /path/to/gcc-4.6/lib
また、 libstdc++ マニュアルにリストされている方法の 1 つを使用して、動的ローダーにそのライブラリを使用するように指示することにより、ライブラリの新しいバージョンが実行時に確実に見つかるようにする必要があります。
例えば:
$ cat x.cc
#include <vector>
#include <fstream>
#include <string>
int main()
{
std::string s = "output";
std::ofstream f(s);
std::vector<int> v(3);
int n;
for (auto i : v)
++n;
f << n << '\n';
}
$ g++-4.6 -std=c++0x x.cc -c
$ g++-4.1 x.o
x.o: In function `main':
x.cc:(.text+0x5c): undefined reference to `std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::_Ios_Openmode)'
collect2: ld returned 1 exit status
$ g++-4.1 x.o -L /path/to/4.6/lib64 -Wl,-rpath,/path/to/4.6/lib64
$ ./a.out
$ cat output
3