所以,这是事情。为了在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