<cmath> 与安卓 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
,但这是?如果我注释掉代码中的includes,一切都很好,但这是不可接受的,因为这个问题会重复出现。。。。很多
isnan
宏已添加到C99中。在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
然后重新清理并构建您的项目。
相关文章:
- macOS 上的 openvino 构建问题
- wxWidgets jpeg库构建问题
- exteranl原生构建问题,构建命令失败,android工作室
- 修复了安装 OSRM 时使用"make"命令时的构建问题
- 使用Spatialite构建问题
- 基于 libzbar 的 Qt 应用程序的构建问题
- 节俭-0.9.3包C++构建问题.使用哪些助推包
- Visual Studio 11 的构建问题
- 使用 QThread 显示构建问题的延时
- 在 OS X 10.8.5 上使用 Xcode 5.0 和 Qt 5.1.1 构建问题
- 在Windows上使用Qt和opencv构建问题
- VS 2010构建问题:参考问题
- gnustl_shared的Android NDK构建问题
- 针对C++的Netbeans构建问题
- <cmath> 与安卓 ndk 一起使用时构建问题
- Gradle构建问题
- c++ Qt Qwt构建问题
- 发布构建问题;将std::string对象传递给静态库函数
- C++图形构建问题
- Cocos2dx构建问题