Quantcast
Channel: Sam的技术Blog
Viewing all articles
Browse latest Browse all 158

NDK下各编译器对C++特性的支持

$
0
0
作者: 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目录中查找头文件。




 

Viewing all articles
Browse latest Browse all 158

Trending Articles