Проблема сборки при использовании <cmath>с android ndk - PullRequest
8 голосов
/ 07 января 2012

У меня есть простой файл stlTest2.cpp, например:

#include <jni.h>

#include <cmath>


bool isnan (void);

В некотором коде, который я портирую, есть что-то более сложное. У меня вопрос такой. Почему это работает при сборке с использованием GCC за пределами NDK, а не с использованием NDK? Там ошибка это дает это:

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

Непосредственной причиной этого является то, что math.h (включается через <cmath>) определяет isnan как макрос. Почему сборка вне ndk не включает #define из math.h, но это так? Если я закомментирую включения в коде, все в порядке, но это неприемлемо, так как эта проблема повторяется .... много.

Ответы [ 2 ]

4 голосов
/ 07 января 2012

Макрос 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

(и аналогично для любых других проблемных макросов, если они вам не нужны).

2 голосов
/ 11 января 2012

В $ ndk \ sources \ cxx-stl \ gnu-libstdc ++ \ libs \ armeabi \ include \ bits \ c ++ config.h (измените armeabi на любое подходящее) измените это:

/* #undef _GLIBCXX_USE_C99_MATH */

to

#define _GLIBCXX_USE_C99_MATH 1

Затем очистите и соберите свой проект снова.

...