1. 如果我用 -std=c++0x 或 -std=g++0x 编译共享库,我是否保证使用我的库的程序不需要这些开关(前提是我没有 c++0x头文件中的功能)?它似乎有效,但我不想为未来的微妙问题而注册。
C++11 支持在 GCC 4.x 版本中仍然是实验性的(从 GCC 5 开始不再是实验性的)。尽管我们试图保持工作正常,但答案是否定的,您通常不能保证在所有情况下都能正常工作。使用导致的许多 ABI 更改-std=c++0x
可能会导致混合 C++03 代码和 C++11 代码的程序出现问题,有关更多详细信息,请参阅http://gcc.gnu.org/wiki/Cxx11AbiCompatibility。如果您的库没有导出该页面上描述的任何符号,那么您应该没问题。
2.g++ 4.4中C++11的标准库相当不完整。由于大部分标准库都是仅头文件,并且 gnu 的头文件通常充满版本 ifdefs,我认为可能有一种方法可以使用 libstdc++ 中至少头文件的更新版本。不过,我不能为它使用不同的 .so 。我敢肯定我可以把它拼凑在一起,但是有可能正确地做这样的事情吗?
不,绝对没有任何可能会奏效。更高版本的标头使用 4.4 不支持的功能,即使您可以使用它们,您也需要使用较新的libstdc++.so
. 就是不行。
标头中没有完整的版本,几乎您会发现只有在使用时由 G++ 定义的#ifdefs
检查,但这并不意味着您的 4.4 版本支持 lambda、非静态数据成员初始化器、正确的右值引用语义,默认/删除的函数等,以后的标头可以自由使用。您必须将 libstdc++ 标头与它们随附的相同版本的 GCC 一起使用。__GXX_EXPERIMENTAL_CXX0X__
-std=c++0x
简而言之,如果您想要适当的 C++11 支持,您需要使用更新的编译器。
如果您不能使用较新的编译器,则无法获得适当的 C++11 支持。