- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个非常严重的 (IMO) 问题。我在 Visual Studio 2015 中使用 native 跨平台工具。
由于标准库的几个实现被visual studio下载了
C:\ProgramData\Microsoft\AndroidNDK\android-ndk-r10e\sources\cxx-stl\
当我开始发现未编译的 STL 类时,我感到很惊讶。
我注销了std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>>
作为 gnu-libstdc++ 的怪癖不可用。
我试过把STL设置成别人的,看看是不是更好。这是在 Visual Studio 项目属性窗口中完成的。
没有制作工具集或 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 被正确调用。
最后我在 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其中包含声明:
It's not possible to fix in GCC without extraordinary effort for a single target, which is not going to happen. If a given target wants to support C++11 features then it needs to provide the necessary C99 features. This is not a GCC issue.
好吧,在 visual studio 中,我将 C 标准设置为 C99,因为 C11 没有任何区别。
我真的不确定如何从这里开始。在我看来,Visual Studio 不知何故没有与 GCC 沟通什么是可用的或不可用的。但这只是一个理论。
我反对尝试手动更改 STL 上的分布。这违背了 STL 的目的。同时,如果没有标准库(考虑到时间限制),我正在进行的这个项目很可能是不可能的。我不敢继续下去,以免发现由于缺少 C 库函数而隐藏了更多关键功能。
我非常希望我可以在 visual studio 中进行一些更改,一些设置或命令行覆盖可以解决此问题。
附言我研究过在 eclipse 或 android studio 中开发 android 部分。 NDK 文档经常提到 eclipse,但 android SDK 有关于不再支持 ADT 的可怕消息。最重要的是,我在调试 native 代码时遇到了开箱即用的问题(但那些超出了范围)。至少,android studio 构建系统 (gradle) 似乎对自定义文件夹结构不友好。我们所有的源都在 TFS 中,此时我无法更改它。
最佳答案
这是 Google 的 Android NDK 的已知问题 - C++ 标准库在那里被破坏,除非您只使用 C++ 功能的一小部分。宏 _GLIBCXX_USE_C99
在 $NDK/sources/cxx-STL/gnu-libstdc++/4.9/libs/$ABI/include/bits/c++config.h 中定义(或未定义)
在 GNU libstdc++ 构建时(即在谷歌方面,当他们构建 NDK 时)。不幸的是,它建立在非常有限的 libc(Google 的 Bionic)之上,因此 GNU libstdc++ 配置脚本会检测到它并禁用某些部分(特别是 std::to_wstring
),具体取决于 libc 中缺少的功能.
这是我开始 CrystaX NDK 的主要原因之一- Android 的替代 native 开发工具包。在 CrystaX NDK 中,我们特别注意 libc、libstdc++ 的完整性以及与一般标准的一致性。 CrystaX NDK 可作为 Google Android NDK 的直接替代品,因此它很可能也适用于 Visual Studio。
关于android - _GLIBCXX_USE_C99 未定义,to_wstring 不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34517938/
我遇到了一个非常严重的 (IMO) 问题。我在 Visual Studio 2015 中使用 native 跨平台工具。 由于标准库的几个实现被visual studio下载了 C:\ProgramD
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: std::to_string - more than instance of overloaded func
我正在尝试学习 C++ Win32。我为游戏环境构建了一个计时器类。典型的游戏计时器,效果很好。我有这个函数,我想用它来显示当前的游戏时间。 std::wstring Time::DisplayGam
我正在尝试学习 C++ Win32。我为游戏环境构建了一个计时器类。典型的游戏计时器,效果很好。我有这个函数,我想用它来显示当前的游戏时间。 std::wstring Time::DisplayGam
为什么这不能在 gcc 上编译? #include #include int main() { double f = 23.43; std::wstring f_str
由于 to_string() 和 to_wstring() 的名称不同,因此几乎不可能在泛型函数中使用它们。因此,我计划将它们与以下内容结合起来: template auto to_xstring(
在一个库中,我在内部使用以下形式的 typedef: using AnsiChar = char; using WideChar = wchar_t; 一个全局 typedef,基本上存储特定于平台的
我是一名优秀的程序员,十分优秀!