<cmath> 与安卓 ndk 一起使用时构建问题

Build issue when using <cmath> with android ndk

本文关键字:构建 问题 一起 cmath lt gt ndk      更新时间:2023-10-16

我有一个简单的文件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,但这是?如果我注释掉代码中的includes,一切都很好,但这是不可接受的,因为这个问题会重复出现。。。。很多

isnan宏已添加到C99中。在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

然后重新清理并构建您的项目。