我遇到了一个非常严重(IMO)的问题.我在visual studio 2015中使用本机跨平台工具.
由于Visual Studio下载了标准库的几个实现
C:\ ProgramData \微软\ AndroidNDK\Android的NDK-r10e \来源\ CXX-STL \
当我开始寻找没有编译的stl类时,我感到很惊讶.
我注销了std::wstring_convert
不能作为gnu-libstdc ++的怪癖.
我试图将stl设置给其他人,看看他们是否更好.这是在visual studio项目属性窗口中完成的.
没有提供工具集或STL的组合std::wstring_convert
.
我接着说,"如果我必须自己实施这一功能,那么这不是世界末日."
然而不久之后我尝试使用to_wstring
.尽管如此wstring
,该功能仍未被识别.
这是一个太过分的步骤,所以我检查了gnu-libstdc ++实际上是否实际上已经实现了任何东西.事实上他们,看到了标准的21.5为Y.
我现在很困惑.我做了一些谷歌搜索,发现没有什么比"将它设置为c ++ 11"更重要.
除非Visual Studio没有使用以下设置执行任何操作,否则我假设正在正确调用GCC.
最后我在visual studio中打开了basic_string.h,以确保该函数实际存在.
这是3000行:
inline wstring to_wstring(int __val) { return __gnu_cxx::__to_xstring(&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未定义.
搜索此问题会产生一些堆栈溢出问题.
大多数评论似乎认为问题将通过GCC的新版本来解决.例如GCC 4.4.5.然而,因为visual studio下载了4.9 ...我不认为这只是版本的问题.
我在那里链接到一个三年前的错误报告,其中包含声明:
如果没有针对单个目标的特别努力,就不可能在GCC中修复,这是不会发生的.如果给定目标想要支持C++ 11功能,那么它需要提供必要的C99功能.这不是海湾合作委员会的问题.
嗯,在视觉工作室我已经将C标准设置为C99,因为记录C11没有任何区别.
我真的不确定如何从这里开始.在我看来,某种程度上Visual Studio没有与GCC通信什么是可用的或不可用的.这只是一个理论.
我反对尝试手动更改stl上的分发.这违背了stl的目的.同时,如果没有标准库(考虑到时间限制),我正在进行的这个项目可能是不可能的.我害怕继续,以免由于缺少C库函数而发现隐藏更多关键功能.
我有这种疯狂的希望,我可以在视觉工作室,一些设置或命令行覆盖,以解决这个问题.
PS 我已经研究过在eclipse或android studio中开发android部分.NDK文档经常提到eclipse,但android SDK有关于ADT的可怕消息不再受支持.最重要的是,我开箱即用调试本机代码(但这些超出了范围).android studio构建系统(gradle)至少对自定义文件夹结构似乎不友好.我们所有的资源都在TFS中,此时我无法改变它.
这是Google的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.