11

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

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

4

2 回答 2

16

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

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

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

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

    • 某些符号可能会改变含义(例如,在 C++98 模式std::complex::realstd::complex::imag返回引用,但在 C++11 模式下按值返回,由于constexpr缺陷)。如果同时使用 C++98 和 C++11 形式将(未优化的)代码链接在一起,您可能选择了错误的实现,并在运行时产生奇怪的结果。

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

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

于 2012-09-29T04:52:14.557 回答
0

取决于编译器。例如,GCC 会在 C++11 模式下以不同方式破坏其 ABI 在 C++11 中更改的标识符。因此,例如,如果您不使用诸如 之类的东西std::list,那么您就可以了。

于 2012-09-28T10:08:57.800 回答