[英]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
命名空间中,重载为float
和double
和long 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宏。)
你需要能够使用编译器提供的isnan
或std::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.