作者: Sam (甄峰) sam_code@hotmail.com
Sam对C++并不擅长,但在使用NDK编译众多第三方库时,会遇到一些C++
特性支持问题。通常的做法都是在编译选项中增加-std=c++11或者-std=c++0x.
但还是有一些特性无法通过编译。现分析如下。
0. 背景介绍:
NDK在R10之后,就推荐使用clang, 而非GCC.
后期版本更是把clang作为缺省编译器。同时,NDK下也提供多种C++库,包括:
NDK自带的(system,
system_re), GAbi(gabi++_static, gabi++_shared),
STLPort(stlport_static, stlport_shared),
GNU-STL(gnustl_static, gnustl_shared).
libstdc++ (默认) |
默认最小系统 C++ 运行时库。 | 不适用 |
gabi++_static |
GAbi++ 运行时(静态)。 | C++ 异常和 RTTI |
gabi++_shared |
GAbi++ 运行时(共享)。 | C++ 异常和 RTTI |
stlport_static |
STLport 运行时(静态)。 | C++ 异常和 RTTI;标准库 |
stlport_shared |
STLport 运行时(共享)。 | C++ 异常和 RTTI;标准库 |
gnustl_static |
GNU STL(静态)。 | C++ 异常和 RTTI;标准库 |
gnustl_shared |
GNU STL(共享)。 | C++ 异常和 RTTI;标准库 |
c++_static |
LLVM libc++ 运行时(静态)。 | C++ 异常和 RTTI;标准库 |
c++_shared |
LLVM libc++ 运行时(共享)。 | C++ 异常和 RTTI;标准库 |
1. C++11一些特性:
std::move 和 vector::data()支持测试:
1.1: 当使用clang+gnustl_shared 这个组合时。
std::move可以支持。
using namespace std;
int main(int argc, char** argv)
{
string str = "Hello World";
vector s_vet;
vector::iterator it;
s_vet.push_back(str);
for(it = s_vet.begin(); it!=s_vet.end(); ++it)
{
cout << endl << *it << endl;
}
s_vet.push_back(std::move(str));
for(it = s_vet.begin(); it!=s_vet.end(); ++it)
{
cout << endl << *it << endl;
}
return 0;
}
可以看到,它在编译时,在/opt/android-ndk-r17b/sources/cxx-stl/gnu-libstdc++/4.9/include目录查找头文件。
1.2: clang + stlport:
不支持std::move。
可以看到,它在编译时,在
/opt/android-ndk-r17b/sources/cxx-stl/stlport/stlport目录中查找头文件。
它不支持std::move
网络文章说,NDK 下STLPort不支持C++11特性。
1.3: clang + C++_Shared
支持std::move
它在编译时,在
/opt/android-ndk-r17b/sources/cxx-stl/llvm-libc++/include目录中查找头文件。