【问题标题】:Build issue when using <cmath> with android ndk将 <cmath> 与 android ndk 一起使用时的构建问题
【发布时间】:2012-01-07 00:03:45
【问题描述】:

我有一个简单的文件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(通过&lt;cmath&gt; 包含)将isnan 定义为宏。为什么 ndk 之外的构建不包括来自math.h 的#define,但这是?如果我注释掉代码中的包含,一切都很好,但这是不可接受的,因为这个问题会反复出现......很多。

【问题讨论】:

  • 为什么用不兼容的类型声明isnan?

标签: android c++ android-ndk cmath


【解决方案1】:

isnan 宏是在 C99 中添加的。在 C++11 中,它作为函数添加到 std 命名空间中,为 float 和 double 和 long double 重载(所以典型的 &lt;cmath&gt; 标头,例如您的非 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

(对于任何其他有问题的宏也是如此,前提是您不需要它们)。

【讨论】:

  • 我可以做到并开始这样做,但代码中充满了这种。我想知道是否有办法让 android 使用不同的、更新的 cmath。如果没有,我会接受你的回答。我已经投了赞成票。谢谢。顺便说一句,很多 math.h 宏都有同样的问题,但同样的解决方案应该可以工作。
  • 找到解决此问题的方法。看我的回答。
【解决方案2】:

在 $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

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

【讨论】:

    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2015-01-13
    • 2019-12-13
    相关资源
    最近更新 更多