gpt4 book ai didi

android - _GLIBCXX_USE_C99 未定义,to_wstring 不可用

转载 作者:行者123 更新时间:2023-11-29 15:08:21 27 4
gpt4 key购买 nike

我遇到了一个非常严重的 (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 项目属性窗口中完成的。

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其中包含声明:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com