C++11 与现有 libraries/frameworks 的兼容性
C++11 compatibility with existing libraries/frameworks
我想知道一些我尚未找到令人信服的答案。
情况:
- 带有一些库(例如 gtkmm)的系统在未启用 c++11 的情况下编译。
- 启用 C++11 编译的应用程序。
- 两者都使用相同的 GCC version/environment 进行编译和链接。
- 该应用程序对使用 std::string 和 std::vector 的库进行了一些函数调用。
std::string 和 std::vector 都支持移动语义,这很可能意味着它们与非 C++11 变体不二进制兼容。然而,应用程序和库都是使用相同的编译器和标准库构建的,所以如果库能够识别并支持它就不会那么奇怪了。
上述情况是否安全,或者是否真的需要使用 C++11 标志编译所有内容,即使使用相同的构建环境?
您可以认为不同编译器对 C++ 的每个翻译(即使编译器相同,但具有不同的(次要)版本)也是不兼容的。 C++ 没有通用的应用程序二进制接口 (ABI)。
此外,编译器支持的方言的变化就是ABI的变化,因此生成的库不兼容。一个明显的例子是发布构建与调试构建,其中调试数据结构引入了额外的成员。
移动结构 (C++11) 或不移动结构 (< C++11) 是 ABI 的根本变化。
This 页面专用于 c++11 到 4.7 版的 g++ abi 中断。
第一句有:
The C++98 language is ABI-compatible with the C++11 language, but several places in the library break compatibility. This makes it dangerous to link C++98 objects with C++11 objects.
虽然有一些示例,其中启用 c++11 不会破坏 ABI 兼容性:一个示例是 Qt,您可以在其中自由混合启用 c++11 的构建与 c++03 构建。
我想知道一些我尚未找到令人信服的答案。
情况:
- 带有一些库(例如 gtkmm)的系统在未启用 c++11 的情况下编译。
- 启用 C++11 编译的应用程序。
- 两者都使用相同的 GCC version/environment 进行编译和链接。
- 该应用程序对使用 std::string 和 std::vector 的库进行了一些函数调用。
std::string 和 std::vector 都支持移动语义,这很可能意味着它们与非 C++11 变体不二进制兼容。然而,应用程序和库都是使用相同的编译器和标准库构建的,所以如果库能够识别并支持它就不会那么奇怪了。
上述情况是否安全,或者是否真的需要使用 C++11 标志编译所有内容,即使使用相同的构建环境?
您可以认为不同编译器对 C++ 的每个翻译(即使编译器相同,但具有不同的(次要)版本)也是不兼容的。 C++ 没有通用的应用程序二进制接口 (ABI)。
此外,编译器支持的方言的变化就是ABI的变化,因此生成的库不兼容。一个明显的例子是发布构建与调试构建,其中调试数据结构引入了额外的成员。
移动结构 (C++11) 或不移动结构 (< C++11) 是 ABI 的根本变化。
This 页面专用于 c++11 到 4.7 版的 g++ abi 中断。 第一句有:
The C++98 language is ABI-compatible with the C++11 language, but several places in the library break compatibility. This makes it dangerous to link C++98 objects with C++11 objects.
虽然有一些示例,其中启用 c++11 不会破坏 ABI 兼容性:一个示例是 Qt,您可以在其中自由混合启用 c++11 的构建与 c++03 构建。