我可以使用 c++11 中的任何东西并期望编译后的二进制文件可以在旧系统上运行吗?我如何知道 c++11 的哪些部分是 libstdc++.so 的一部分,以及实际编译到二进制文件中的是什么?也许我不完全理解这些事情是如何运作的。 c++11 是否会破坏旧库的 ABI 合规性?
一个清晰的例子:
假设我编译了一个使用 auto 和基于新范围的 for 循环的程序。这些东西似乎应该在具有旧 c++ 运行时的系统上工作,因为它们分解为在这些机器上有效的 c++。但是,使用正则表达式之类的东西应该会在旧系统上中断,因为它不会在它们的运行时中。
我还没有测试我的理论,因为我无法访问与 c++11 兼容的编译器,而且我的谷歌搜索也没有帮助。
最佳答案
你是对的。代码本身可以编译以在任何带有 C++ 编译器的平台上工作。新的语言结构(范围为 for
、新关键字如 auto
等)使用新编译器进行编译,以便在旧系统上正常工作。
但是,如果您尝试将使用新符号(如正则表达式)的代码链接到旧库,那么无论您是静态链接还是动态链接,都会遇到问题,因为旧库没有新符号。
假设您的代码使用新符号:
- 如果您静态链接到旧库,则链接将失败,因为旧库中不存在新符号。
- 如果您动态地链接到旧库,您仍然会遇到链接器问题,同样因为库不包含新符号。
- 如果您静态链接到新库,则生成的二进制文件将在旧系统上运行。
- 如果您动态地链接到新库,则生成的二进制文件将在旧系统上运行,前提是它已经有新库,或者如果您将新库与二进制文件一起分发。
- 但如果您随后尝试用旧动态库替换新动态库,它将无法链接到该库中的新符号,因为它们不存在。
关于C++11 向后兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19729441/