2012-07-17 165 views
2

所以,這是事情。爲了在Linux上開發Maya插件,我們必須使用GCC 4.1.2進行編譯。但是這個編譯器不支持任何新的C++ 0x功能。g ++ 4.1.2與g ++混合4.6

纔有可能做這樣的事情:

gcc-4.6 -o test.cpp.o -c test.cpp 
gcc-4.1.2 -o exec_test test.cpp.o 

我嚴重懷疑這將是可能的,但值得一問。

如果這是不可能的,有沒有辦法實現類似的東西?

+0

這肯定是不行的,因爲它是。即使是簡單的hello-world應用程序也無法正確鏈接。 – 2012-07-17 18:49:47

+0

我想這兩個版本之間的差異太大了,以便能夠正確鏈接! – widgg 2012-07-17 18:52:44

+1

如果您開發的代碼可以避免使用C++支持庫,那麼編譯成彙編語言('gcc -S')可能會有一些成功,而將輸出與較舊的gcc彙編在一起。它適用於4.7-> 4.4,使用'auto'關鍵字進行測試。 – fork0 2012-07-17 19:02:36

回答

3

的ABI對於這兩個版本的GCC是兼容的,問題是由GCC 4.6編譯的目標可能取決於只能由較新的海灣合作委員會的C中定義的符號++標準庫(例如,如果您使用std::fstream構造採取std::string你的對象將會依賴於那個符號,這個符號只在支持C++ 11的GCC的最新版本中出現)。

只要你從GCC 4.6鏈接到libstdC++(它是libstdc++.so.6.0.16)即通過鏈接與-L /path/to/gcc-4.6/lib

您還必須確保在運行時找到更新版本的庫,即告訴動態加載程序使用該庫,使用在libstdc++ manual

上市例如方法之一:

$ 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 
+0

甜美!就如此容易 ?我想有些情況下它會更復雜一些。 – widgg 2012-07-18 16:47:22

+1

你的第二個命令所做的就是調用鏈接器'ld',只要你告訴鏈接器如何找到正確的庫,不管你是通過GCC 4.1還是通過4.6調用'ld',或者直接作爲'ld' – 2012-07-19 11:10:42