AndroidソースコードのC ++ STL名前空間

Tian Haili @ CSDN 2020-11-22

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を使用するためにサードパーティのライブラリと通信する必要があります。そうしないと、実行時まで不可解な問題をデバッグするのがより面倒になります。

 

おすすめ

転載: blog.csdn.net/thl789/article/details/109920740
おすすめ