[英]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.