2015-04-01 65 views
1

我目前正在嘗試跨編譯我以前開發的跨平臺庫,以便在Android上使用它。 爲此,我使用NDK提供的arm-linux-androideabi-g ++(4.9)編譯器,並鏈接也存在於NDK中的gnu-libstdC++。Android上的完整C++ 11支持

不幸的是,由於使用了一些C++ 11功能,編譯將不會成功。 這些特徵是「std :: to_string」或「std :: stof」這樣的「string.h」中存在的特定方法,如果必須的話,可以用其他方法輕鬆替換。 但我也使用更復雜的,比如來自「future.h」的東西,如std :: future和std :: async。

我在文件「ndk/sources/cxx-stl/gnu-libstdC++/4.9/bits/basic_string.h」中找到了「string.h」的編譯錯誤原因,下面的語句返回假(_GLIBCXX_USE_C99沒有定義):

//basic_string.h 

#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \ 
    && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) 

//methods I want to use 

#endif 

從我的理解,這些限制是由Android的仿生libc中引起的。

我有什麼辦法解決這個問題?

我已經試過使用CrystaX NDK,但它只解決了我的「string.h」問題,我寧願找到更標準的解決方案。

如何使用不特定於Android的ARM交叉編譯器?

謝謝。

+0

我已經回覆給你[android-ndk](https://groups.google.com/forum/#!topic/android-ndk/6NjpXqr7QWQ)組,但它今天工作的時間很長,所以我的答案仍然沒有出現在那裏。關於 - 你能說更詳細的問題嗎?應該沒有問題阻止它的使用,所以它可能是你的錯誤或CrystaX NDK中的錯誤。如果有問題,我們很樂意解決它,所以請讓我知道什麼是錯的。順便說一句,您可以使用我們的[bug跟蹤器](https://tracker.crystax.net/projects/ndk)來存檔,我們會盡快解決問題。 – 2015-04-01 18:35:13

回答

0

我終於找到了解決這個問題的方法。

首先,使用「future.h」方法完全由android NDK提供的gnu-libstdC++支持,我只是錯過了一些允許其使用的內容,我的錯誤。

接下來,我深入瞭解了我的庫,並發現實際導致編譯錯誤的唯一方法是std :: to_string。 所以我決定乾脆用下面的覆蓋它:

#if __ANDROID__ 

namespace std { 
    #ifndef to_string 
    inline string to_string(int _Val) 
    { // convert int to string 
     char _Buf[256]; 
     sprintf(_Buf, "%d", _Val); 
     return (string(_Buf)); 
    } 
    #endif 
} 

#endif 

我想,如果有一些其他不支持C++ 11的方法,它可以覆蓋他們。