簡體   English   中英

使用時構建問題 <cmath> 用android 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 ,但這是? 如果我在代碼中注釋掉包含,那么一切都很好,但這是不可接受的,因為這個問題重復了......很多。

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

然后再次清理並構建項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM