在linux上编译和链接不同版本的gcc

时间:2013-03-11 10:32:59

标签: c++ gcc linker elf

我打算用gcc 4.7.1编译一个静态库(mylib.a)。我想利用C ++ 11的优点,所以使用-std = c ++ 11。我编译这个lib的平台是x86_64 SLES 11和glibc-2.8。

然后我想将旧版平台上的静态库与遗留代码链接起来,因此我必须使用gcc 4.1.2来链接和编译遗留代码。所以在我的库头文件中,我不会使用任何C ++ 11特定的代码。我还将链接libstdc ++。a来自gcc.4.7.1。我要链接mylib.a,libstdc ++。a(gcc4.7.1)和遗留对象文件的平台是带有glibc-2.4的x86_64 SLES 10。

我在mylib.a中尝试了所有这些混乱的虚拟C ++ 11代码(std :: async())并且它有效。我认为这可能只是因为ELF的要求。我是否正确思考,或者ELF与它无关?如果mylib.a将包含一些真正复杂的逻辑,我应该期待什么样的错误?

2 个答案:

答案 0 :(得分:2)

Linux has a C++ Application Binary Interface (ABI),已经存在了一段时间。这意味着Linux上编译器的调用约定和名称修改是固定的。因此,只要库是兼容的,您就应该能够使用不同的编译器(或相同编译器的不同版本)进行编译,并使代码能够正确可靠地链接在一起。

不完全是ELF要求本身 ......

答案 1 :(得分:2)

GCC保证二进制兼容性一直回到一些古老的版本3.只要您链接的libstdc ++具有新的库功能,就没有理由不能使用它们。您将不得不远离使用GCC 4.1.2编译的代码中的新语言和库功能。