2015-04-01 140 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的方法,它可以覆盖他们。