g++-std=c++0x及其兼容性
g++ -std=c++0x and compatibility
我使用g++4.4在linux上编译一个共享库。如果可以的话,我想在库中使用一些C++11功能,但我不能更新编译器的版本,也不能为库的用户要求任何特殊的编译器开关。
我有两个问题,很难找到确切的答案。
-
如果我用-std=c++0x或-std=g++0x编译一个共享库,我能保证使用我的库的程序不需要这些开关吗(前提是我在头文件中没有c++0x功能)?这似乎奏效了,但我不想因为以后的微妙问题而报名。
-
g++4.4中C++11的标准库是相当不完整的。由于大部分标准库都只是头文件,而且gnu的头文件通常都是ifdef版本,所以我认为可能有一种方法可以使用libstdc++中至少头文件的最新版本。我不能用不同的。不过,就这样吧。我确信我可以把这些拼凑在一起,但有可能正确地做这样的事情吗?
谢谢。
1。如果我使用-std=c++0x或-std=g++0x编译共享库,我是否可以保证使用我的库的程序不需要这些开关(前提是我在头文件中没有c++0xs功能)?这似乎奏效了,但我不想因为以后的微妙问题而报名。
C++11支持在GCC 4.x版本中仍然是实验性的(从GCC 5开始不再是实验性)。尽管我们试图让事情继续下去,但答案是否定的,你通常不能保证在所有情况下都能成功。使用-std=c++0x
会导致许多ABI更改,这些更改可能会给混合使用C++03代码和C++11代码的程序带来问题,请参阅http://gcc.gnu.org/wiki/Cxx11AbiCompatibility了解更多详细信息。如果你的库没有导出该页面上描述的任何符号,那么你应该没事。
2.g++4.4中C++11的标准库相当不完整。由于大部分标准库都只是头文件,而且gnu的头文件通常都是ifdef版本,所以我认为可能有一种方法可以使用libstdc++中至少头文件的最新版本。我不能用不同的。不过,就这样吧。我确信我可以把这些拼凑在一起,但有可能正确地做这样的事情吗?
不,这绝对不可能奏效。更高版本的标头使用了4.4不支持的功能,即使您可以使用它们,也需要使用更新的libstdc++.so
。只是没有
头文件并没有充满版本#ifdefs
,几乎你能找到的只有对__GXX_EXPERIMENTAL_CXX0X__
的检查,当你使用-std=c++0x
时,它是由G++定义的,但这并不意味着你的4.4版本支持lambdas、非静态数据成员初始值设定项、正确的右值引用语义、默认/删除函数等,这些都是后来的头文件可以自由使用的。必须将libstdc++标头与附带的GCC版本一起使用。
简言之,如果您想要适当的C++11支持,您需要使用更新的编译器。
如果你不能使用更新的编译器,你就无法获得正确的C++11支持。
我不会尝试这个。只要在一个头中使用一个C++11定义的宏来更改类或函数的定义,最终用户就会违反一个定义规则。我想,这些用途可能非常微妙。
类似地,还有一个vector(count, item = T())
构造函数,它在C++11中已经不存在了(现在是两个构造函数)。
简言之,你必须非常小心你在库中使用的标准库组件,以避免违反一个定义规则,我无法想象破坏的风险值得使用这些功能。
可以使用boost
和tr1
来填补语言空白,直到您可以使用新的编译器和/或允许您的最终用户使用C++11支持进行编译。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 提升序列化 1:73 的向后兼容性问题
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- 各种版本的 Mac OSX 向后兼容性如何?(Xcode C++
- Visual Studio 19-17 库兼容性根据 GL 标志
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- 0x%08lx 格式说明符在 printf 语句到 cout
- C++ ABI 兼容性问题/张量流
- Oracle OCCI 和 g++ 7.1 的兼容性问题
- 为什么库API+编译器ABI足以确保具有不同版本gcc的对象之间的兼容性
- 对指针和恒常性兼容性的引用
- 检查操作系统兼容性
- 添加noexcept是否会破坏二进制兼容性
- 右值需要分配什么向后兼容性
- 如何在不添加对库的依赖的情况下添加与库结构的兼容性
- 在Qt中使用C++Lambda函数作为插槽是否有助于保持库的二进制兼容性?
- python 和 swig 版本兼容性问题
- Tensorflow C++ API 和 Caffe 兼容性问题与 Glog 相关
- 如何使系统在十六进制数之前打印 0x,在八进制数之前打印 0?
- g++-std=c++0x及其兼容性