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

Compiling and linking with a different versions of gcc on linux

本文关键字:gcc linux 版本 链接 编译      更新时间:2023-10-16

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

然后我想在遗留平台上链接这个静态库和遗留代码,因此我必须使用gcc 4.1.2来链接和编译遗留代码。所以在我的库头中,我不会使用任何c++ 11特定的代码。此外,我将链接libstdc++。来自gcc.4.7.1。这个平台,我想链接我的lib。libstdc++.a(gcc4.7.1)和遗留的目标文件是x86_64 SLES 10与glibc-2.4。

我用mylib中的一些虚拟c++ 11代码(std::async())尝试了所有这些混乱。A,它起作用了。我认为这是可能的,只是因为ELF的要求。是我想对了吗,还是ELF与此无关?我应该期待什么样的错误,如果mylib。A将包含一些真正复杂的逻辑?

Linux有一个c++应用程序二进制接口(ABI),它已经存在一段时间了。这意味着Linux上编译器之间的调用约定和名称混淆是固定的。因此,只要库是兼容的,您就应该能够使用不同的编译器(或同一编译器的不同版本)进行编译,并拥有正确可靠地链接在一起的代码。

不完全是ELF要求本身

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