「AndroidソースコードのC ++ STL」では、AndroidソースにLLVM c ++ STLとNDKc ++ STLが組み込まれていると述べています。これら2つのstlを区別するにはどうすればよいですか?C ++は名前空間によって分離されているため、stlも分離されています。この記事では、これら2つのSTLを名前付きで分離する方法を段階的に分析します。これにより、stlユーザーが使用時にstlでラベルを見つけられない理由も明らかになります。
アプリケーションでSTLを使用するには、最初に各stlのヘッダーファイルにあるSTLプロトタイプが必要です。また、ソースファイルはライブラリ(動的.so / static.a)にコンパイルされます。ヘッダーファイルと対応するライブラリは一致する必要があります。
1. STL c ++ヘッダーファイルとソースファイル
Androidでは、選択したstlに応じて異なるパスがあります:
ndk:prebuilts / ndk / current / sources / cxx-stl / llvm-libc ++ / include /
aosp:external / libcxx / include /
STLのヘッダーファイルとソースファイルは、前後の次のマクロに含まれます。
_LIBCPP_BEGIN_NAMESPACE_STD
// sources or headers
_LIBCPP_END_NAMESPACE_STD
_LIBCPP_BEGIN_NAMESPACE_STDと_LIBCPP_END_NAMESPACE_STDはファイル__configで定義されており、これらの異なるSTLパスには独自の__configファイルが含まれます。
2._LIBCPP_BEGIN_NAMESPACE_STDおよび_LIBCPP_END_NAMESPACE_STDの定義[ __config内]
_LIBCPP_BEGIN_NAMESPACE_STDおよび_LIBCPP_END_NAMESPACE_STDは、次のファイル__configで定義されています。
#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE {
#define _LIBCPP_END_NAMESPACE_STD } }
2.1_LIBCPP_NAMESPACEの定義
//__config: [external/libcxx/include/]
#define _LIBCPP_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION)
//__config: [prebuilts/ndk/current/sources/cxx-stl/llvm-libc++/include/]
#define _LIBCPP_NAMESPACE _LIBCPP_CONCAT(__ndk,_LIBCPP_ABI_VERSION)
2.1.1 _LIBCPP_CONCAT
#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y
#define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y)
2.1.2 _LIBCPP_ABI_VERSION
#ifndef _LIBCPP_ABI_VERSION
#define _LIBCPP_ABI_VERSION 1
#endif
だから、Androidのソースコードに_LIBCPP_NAMESPACEは、二つの定義を有する:
-中のlibc ++ SO:__1
- ++ libcの_共有:__ndk1
_LIBCPP_BEGIN_NAMESPACE_STDはまた、二つの定義があります
-でのlibc ++ SO:名前空間std {{インライン名前空間__1 -でlibc ++ _ shared.so:namespace std {インラインnamespace__ndk1 {
3.結論
AndroidソースコードのSTL:
libc ++の名前空間[ヘッダーファイル:external / libcxx / include /]:libc ++ _sharedの
std :: __ 1
名前名[ヘッダーファイル:prebuilts / ndk / current / sources / cxx-stl / llvm-libc ++ / include /】:
std :: __ ndk1
したがって、コンパイルおよびリンク時にSTLで変数/関数を見つけることができないなどのエラー(特に名前名 "std :: __ 1"、 "std :: __ ndk1"などの単語)は、STLヘッダーファイルのパス/リンクの使用を検討する必要があります。図書館は理由を待っていた。これは、たとえば、異なるコンパイルユニットが以前に個別にコンパイルされていて、一貫性のないSTLを使用している場合に発生する可能性があります。また、サードパーティのライブラリを使用する場合は、一貫性のあるSTLを使用するためにサードパーティのライブラリと通信する必要があります。そうしないと、実行時まで不可解な問題をデバッグするのがより面倒になります。