在Linux上编译和链接不同版本的gcc
问题描述:
我打算编译一个静态库(mylib.a)和gcc 4.7.1。我想要利用C++ 11的优势,因此使用-std = C++ 11。我编译这个lib的平台是带有glibc-2.8的x86_64 SLES 11。在Linux上编译和链接不同版本的gcc
然后,我想将旧版平台上的静态库与旧版代码链接起来,因此我必须使用gcc 4.1.2来链接和编译旧版代码。所以在我的库头文件中,我不会使用任何C++ 11特定的代码。我也会链接来自gcc.4.7.1的libstdC++。a。我想要链接mylib.a,libstdC++。a(gcc4.7.1)和遗留目标文件的平台是带有glibc-2.4的x86_64 SLES 10。
我试着用mylib.a中的一些虚拟C++ 11代码(std :: async())来处理所有这些乱七八糟的事情。我认为这可能只是因为ELF的要求。我是否正确思考,或者ELF与它无关?如果mylib.a包含一些真正复杂的逻辑,我应该期待什么类型的错误?
答
Linux has a C++ Application Binary Interface (ABI),这已经有一段时间了。这意味着Linux上的编译器调用约定和名称是固定的。因此,只要库兼容,您应该能够使用不同的编译器(或相同编译器的不同版本)进行编译,并且可以将代码正确可靠地链接在一起。
不完全是ELF要求本身 ...
答
GCC保证二进制兼容性回到一些古老的版本3.一路只要++要链接到的libstdc有新的库功能,没有理由不能使用它们。您将不得不使用使用GCC 4.1.2编译的代码中的新语言和库特性。