g ++ 4.1.2与g ++ 4.6混合使用

时间:2012-07-17 18:46:12

标签: gcc g++ version

所以,这就是事情。要在Linux上开发Maya的插件,我们必须使用GCC 4.1.2进行编译。但是这个编译器不支持任何新的C ++ 0x特性。

是否可以做这样的事情:

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

我严重怀疑这是可能的,但值得一提。

如果无法做到这一点,有没有办法实现类似的目标?

1 个答案:

答案 0 :(得分:3)

这两个GCC版本的ABI是兼容的,问题是GCC 4.6编译的对象可能依赖于仅由较新的GCC的C ++标准库定义的符号(例如,如果您使用std::fstream构造函数获取std::string您的对象将依赖于该符号,该符号仅出现在支持C ++ 11的最新GCC版本中。)

只要您从GCC 4.6(libstdc++.so.6.0.16)链接到libstdc ++,即通过链接到-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