2

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

然后我想将遗留平台上的这个静态库与遗留代码链接,因此我必须使用 gcc 4.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 的要求。我的想法是否正确,或者ELF与它无关?如果 mylib.a 包含一些真正复杂的逻辑,我应该期待什么样的错误?

4

2 回答 2

3

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

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

于 2013-03-11T10:37:36.633 回答
2

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

于 2013-03-11T10:38:35.290 回答