2012-07-17 98 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