1

使用新的 Visual Studio 2015 预览版创建原生 Android NDK 项目并将 STL 更改为“LLVM libc++ 静态库 (c++_static)”时,只需包含<cmath>在默认的“main.cpp”文件中并使用默认的 Clang 3.4 进行编译导致以下问题:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Apps\android-ndk-r10\sources\cxx-stl\llvm-libc++\libcxx\include\cmath(652,8): error : no member named 'float_t' in the global namespace
1>  using ::float_t;
1>        ~~^
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\Apps\android-ndk-r10\sources\cxx-stl\llvm-libc++\libcxx\include\cmath(653,8): error : no member named 'double_t' in the global namespace
1>  using ::double_t;
1>        ~~^
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\Apps\android-ndk-r10\sources\cxx-stl\llvm-libc++\libcxx\include\cmath(680,85): error : use of undeclared identifier 'acosl'
1>  inline _LIBCPP_INLINE_VISIBILITY long double acos(long double __x) _NOEXCEPT {return acosl(__x);}

...和更多。

这在使用 Eclipse 时从来没有引起过问题,所以我不确定我做错了什么或者默认项目是否有问题?

编辑:现在我已经向 Microsoft Connect 添加了一个错误修复票:

https://connect.microsoft.com/VisualStudio/feedback/details/1031464/compiling-ndk-project-when-includes-cmath-causes-issues-with-clang-and-libc

4

2 回答 2

4

原因是<math.h>存在于 android 平台 19 及更低版本的这些 typedef 由

#if 0
#endif

堵塞。对于这些平台,这些额外的定义在

$(VS_NdkRoot)/sources/android/support/include

只需在 Visual Studio 的项目设置中包含此文件夹即可成功编译。

顺便说一句,较新的 NDK-10c 中平台 21的<math.h>文件看起来是固定的(因此您不需要包含支持文件夹),但是 Visual Studio 2015 Preview 安装版本 10。当用 10c 替换已安装的版本 10 时,然后,我们在项目资源管理器中选择以平台 21 为目标(尽管官方不支持)。这编译得很好,虽然它以平台 21 为目标,但在解决此问题之前应该没问题。

这是相关的 Android 错误报告(实际上是 Visual Studio 问题,因为它应该在默认项目中包含此文件夹):

https://code.google.com/p/android/issues/detail?id=79890&thanks=79890&ts=1416335194

编辑:用较新的 VS_NdkRoot 宏更改了旧的 NDKRoot 宏。

于 2014-11-19T00:46:54.877 回答
3

我在使用 Android NDK 和 Visual Studio 2015 时遇到问题cossin解决方案是在 Android 项目的链接器项目设置中强制将数学库包含在 Android 构建中:

在此处输入图像描述

于 2014-12-16T13:38:08.240 回答