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

C++ 在linux上编译和链接不同版本的gcc,c++,gcc,linker,elf,C++,Gcc,Linker,Elf,我计划用GCC4.7.1编译一个静态库(mylib.a)。我想利用C++11的优点,因此使用-std=C++11。我编译这个库的平台是x86_64 SLES 11和glibc-2.8 然后我想用遗留代码链接遗留平台上的这个静态库,因此我必须使用GCC4.1.2来链接和编译遗留代码。因此,在我的库标题中,我不会使用任何特定于C++11的代码。我还将从gcc.4.7.1链接libstdc++.a。我想要链接mylib.a、libstdc++.a(gcc4.7.1)和遗留对象文件的平台是x86_64

我计划用GCC4.7.1编译一个静态库(mylib.a)。我想利用C++11的优点,因此使用-std=C++11。我编译这个库的平台是x86_64 SLES 11和glibc-2.8

然后我想用遗留代码链接遗留平台上的这个静态库,因此我必须使用GCC4.1.2来链接和编译遗留代码。因此,在我的库标题中,我不会使用任何特定于C++11的代码。我还将从gcc.4.7.1链接libstdc++.a。我想要链接mylib.a、libstdc++.a(gcc4.7.1)和遗留对象文件的平台是x86_64 SLES 10和glibc-2.4

我用mylib.a中的一些伪C++11代码(std::async())尝试了所有这些混乱,结果成功了。我认为这是可能的,只是因为ELF的要求。我的想法是正确的,还是精灵与此无关?如果mylib.a将包含一些真正复杂的逻辑,我应该预期会出现什么样的错误?

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


不完全是ELF要求本身…

GCC保证了二进制兼容性,可以追溯到3的一些古老版本。只要链接到的libstdc++具有新的库功能,就没有理由不使用它们。您只需远离使用GCC4.1.2编译的代码中的新语言和库特性