_GLIBCXX_USE_C99未定义,to_wstring不可用

时间:2015-12-29 19:41:57

标签: android visual-studio c++11 stl android-ndk

我遇到了一个非常严重(IMO)的问题。我在visual studio 2015中使用原生的跨平台工具。

由于Visual Studio已经下载了标准库的几个实现

  

C:\ ProgramData \微软\ AndroidNDK \机器人-NDK-r10e \源\ CXX-STL \

当我开始寻找未编译的stl类时,我感到很惊讶。

我注销std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>无法作为 gnu-libstdc ++的怪癖。

我试图将stl设置为其他人,看看他们是否更好。这是在visual studio项目属性窗口中完成的。

enter image description here

没有工具集或STL的组合使std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>可用。

我接着说,“如果我必须自己实施这一功能,那就不是世界末日。”

然而不久之后我尝试使用to_wstring。即使wstring是,也无法识别该功能。

这是一个太过分了,所以我检查了 gnu-libstdc ++ 实际上是否实现了任何东西。事实上,他们有see 21.5 of the standard is Y

我现在很困惑。我做了一些谷歌搜索,发现没有什么比“将它设置为c ++ 11。”

除非Visual Studio没有使用以下设置执行任何操作,否则我假设正在正确调用GCC。

enter image description here

最终我在visual studio中打开了basic_string.h,以确保该函数实际存在。

第3000行:

inline wstring
to_wstring(int __val)
{ return __gnu_cxx::__to_xstring<wstring>(&std::vswprintf, 4 * sizeof(int), L"%d", __val); }

然后我通过阴影看到它被预处理器省略了。看哪,2847行:

#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
     && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))

问题不在于__cplusplus,也没有_GLIBCXX_HAVE_BROKEN_VSWPRINTF。 _GLIBCXX_USE_C99未定义。

搜索此问题产生了a couple of stack overflow questions

大多数评论似乎认为问题将通过新版GCC解决。例如GCC 4.4.5。然而,因为visual studio下载了4.9 ...我不认为这只是版本的问题。

我在那里链接到three year old bug report,其中包含声明:

  

如果没有特别的努力,就不可能在GCC中修复   单一目标,这是不会发生的。如果给定目标需要   要支持C ++ 11功能,它需要提供必要的C99   特征。这不是海湾合作委员会的问题。

好吧,在视觉工作室我把C标准设置为C99,因为记录C11没有任何区别。

我真的不确定如何从这里开始。在我看来,某种程度上Visual Studio没有与GCC通信什么是可用的或不可用的。这只是一个理论。

我反对尝试手动更改stl上的分发。这违背了stl的目的。同时,如果没有标准库(考虑到时间限制),我正在进行的这个项目可能是不可能的。我害怕继续,以免因缺少C库函数而发现隐藏更多关键功能。

我有这种疯狂的希望,我可以在visual studio中进行更改,某些设置或命令行覆盖可以解决此问题。

P.S。 我已经研究过在eclipse或android studio中开发android部分。 NDK文档经常提到eclipse,但android SDK有关于ADT的可怕消息不再受支持。最重要的是,我开箱即用调试本机代码(但这些超出了范围)。 android studio构建系统(gradle)至少对自定义文件夹结构似乎不友好。我们所有的资源都在TFS中,此时我无法改变它。

1 个答案:

答案 0 :(得分:5)

这是谷歌Android NDK的已知问题 - C ++标准库在那里被打破,除非您只使用C ++的一小部分功能。在GNU libstdc ++构建时(即在Google的构建NDK时),在_GLIBCXX_USE_C99中定义(或未定义)宏$NDK/sources/cxx-stl/gnu-libstdc++/4.9/libs/$ABI/include/bits/c++config.h。不幸的是,它建立在非常有限的libc(Google&#Bionic)之上,因此GNU libstdc ++配置脚本检测它并禁用某些部分(特别是std::to_wstring),具体取决于缺少的功能在libc。

这是我开始CrystaX NDK的另一个主要原因 - Android的替代原生开发工具包。在CrystaX NDK中,我们特别注意libc,libstdc ++的完整性以及对标准的一致性。 CrystaX NDK可以作为谷歌Android NDK的直接替代品,所以很可能它也只适用于Visual Studio。