繁体   English   中英

使用时构建问题 <cmath> 用android ndk

[英]Build issue when using <cmath> with android ndk

我有一个像这样的简单文件stlTest2.cpp

#include <jni.h>

#include <cmath>


bool isnan (void);

在我移植的一些代码中有一些更复杂的东西。 我的问题是这个。 为什么在NDK之外使用GCC构建时会有效,而不是使用NDK? 它给出的错误是这样的:

jni/stlTest2.cpp:6: error: expected unqualified-id before 'sizeof'
jni/stlTest2.cpp:6: error: expected ')' before 'sizeof'

其直接原因是math.h (通过<cmath>包含)将isnan定义为宏。 为什么ndk之外的构建不包括math.h#define ,但这是? 如果我在代码中注释掉包含,那么一切都很好,但这是不可接受的,因为这个问题重复了......很多。

在C99中添加了isnan宏。 在C ++ 11中,它作为函数添加到std命名空间中,重载为floatdoublelong double (所以典型的<cmath>头文件,例如你的非NDK GCC可能正在使用,可能有这样的东西:

#undef isnan

inline bool isnan(float ...) { ... }

inline bool isnan(double ...) { ... }

inline bool isnan(long double ...) { ... }

),但显然NDK还没有得到备忘录,并且仍然提供C99宏作为方便。 isnan从来都不是C ++中的宏,但在TR1添加std::tr1::isnan ,没有真正的C ++替代品,因此多个C ++编译器提供了C99宏。)

你需要能够使用编译器提供的isnanstd::isnan吗? 如果没有,那么你可以改变这个:

#include <cmath>

对此:

#include <cmath>

#undef isnan

(对于任何其他有问题的宏,类似地,只要你不需要它们)。

在$ ndk \\ sources \\ cxx-stl \\ gnu-libstdc ++ \\ libs \\ armeabi \\ include \\ bits \\ c ++ config.h(将armeabi改为任何合适的)改变这个:

/* #undef _GLIBCXX_USE_C99_MATH */

#define _GLIBCXX_USE_C99_MATH 1

然后再次清理并构建项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM