问题 带有C ++ 11源代码的C ++ 03库


如果我有用C ++ 03编写的库并将其编译为静态库,那么我可以在C ++ 11中使用它吗?也是相反的可能(使用C ++ 03的C ++ 11静态库)。

更新: 我使用的编译器是clang或LLVM


9145
2017-09-28 09:53


起源

您的C ++ 03编译器和标准库二进制文件是否与C ++ 11编译器和标准库兼容?
@hvd - 点了;我删除了之前的评论。谢谢。 - mah
你提到了你现在使用的编译器,但没有提到标准库。 clang至少可以用于GCC的libstdc ++和 的libc ++,我不知道是否还有其他人。
我认为使用libc ++会更有意义 - NebulaFox
在这种情况下,我知道一些可能导致libstdc ++问题的不兼容性不适用,但我不确定是否可能存在其他问题。


答案:


这主要取决于您如何在库中使用C ++标准库。

  • 如果您根本不使用它,那么您不太可能遇到任何问题。

  • 如果你使用 libstdc++,那么你可能会遇到一些问题:

    • 将标准库对象传入和传出库并不总是有效(例如, std::list 在C ++ 11模式下,它最终会比目前在C ++ 98模式下更大,因为它正在增长 size 数据成员,以及 std::string 正在改为非参考计数的一个)。 g ++开发人员计划引入一种符号污染形式,以便在链接时捕获这些问题,因此如果遇到任何有问题的情况,你会遇到错误,但是这还没有在g ++中实现,可能永远不会在铛。您可以通过确保库的接口不涉及标准库类型来避免此问题。

    • 某些符号可能会改变含义(例如, std::complex::real 和 std::complex::imag 在C ++ 98模式下返回引用,但由于a,在C ++ 11模式下按值返回 constexpr 不足)。如果使用C ++ 98和C ++ 11表单链接(未优化)代码,则可能选择了错误的实现,在运行时会出现奇怪的结果。

  • 如果你使用 libc++,你不应该看到任何问题。 libc++ 被设计为C ++ 98和C ++ 11模式之间的二进制兼容。

  • 如果你使用 libc++ 在图书馆和 libstdc++ 在程序中,反之亦然,那么大多数不兼容性将在链接时被捕获。 (libc++ 用一个 inline namespace 中 namespace std 包含大多数符号,如果您尝试传递,会导致链接时不兼容 libstdc++跨越边界的类型。但是,如果您的库的界面可能仍然存在运行时问题 间接 包含标准库类型(例如,如果它使用 struct 它具有标准库类型作为成员)。对于那些类型 libc++ 不版本,它的目标是二进制兼容 libstdc++ (在C ++ 98和C ++ 11模式下)。


15
2017-09-29 04:52



通过将ABI兼容性问题排除在界面之外,无法完全避免ABI兼容性问题。它们可以出现的另一个地方是,如果界面中出现的其他类型内部存储了ABI不兼容的标准库对象。 - bames53
我希望“不涉及标准库类型”会涵盖这种情况,但如果您认为不清楚,我会编辑答案。 - Richard Smith


取决于编译器。例如,GCC在C ++ 11模式下破坏了C ++ 11中ABI发生变化的标识符。所以,例如,如果你不使用诸如此类的东西 std::list那你很好。


0
2017-09-28 10:08