所以,這是事情。爲了在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
我嚴重懷疑這將是可能的,但值得一問。
如果這是不可能的,有沒有辦法實現類似的東西?
所以,這是事情。爲了在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
我嚴重懷疑這將是可能的,但值得一問。
如果這是不可能的,有沒有辦法實現類似的東西?
的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
甜美!就如此容易 ?我想有些情況下它會更復雜一些。 – widgg 2012-07-18 16:47:22
你的第二個命令所做的就是調用鏈接器'ld',只要你告訴鏈接器如何找到正確的庫,不管你是通過GCC 4.1還是通過4.6調用'ld',或者直接作爲'ld' – 2012-07-19 11:10:42
這肯定是不行的,因爲它是。即使是簡單的hello-world應用程序也無法正確鏈接。 – 2012-07-17 18:49:47
我想這兩個版本之間的差異太大了,以便能夠正確鏈接! – widgg 2012-07-17 18:52:44
如果您開發的代碼可以避免使用C++支持庫,那麼編譯成彙編語言('gcc -S')可能會有一些成功,而將輸出與較舊的gcc彙編在一起。它適用於4.7-> 4.4,使用'auto'關鍵字進行測試。 – fork0 2012-07-17 19:02:36