Espacio de nombres C ++ STL en el código fuente de Android

Tian Haili @ CSDN 2020-11-22

" C ++ STL en el código fuente de Android" mencionó que hay LLVM c ++ STL y NDK c ++ STL incorporados en Android Source. ¿Cómo distinguir entre estos dos stl? C ++ está aislado por espacio de nombres, al igual que stl. Este artículo analiza paso a paso cómo aislar estos dos STL con espacio de nombres, lo que también puede aclarar las razones del problema de que los usuarios de stl no pueden encontrar la etiqueta en stl cuando lo usan.

 

Para usar STL en una aplicación, primero debe tener prototipos de STL, que están en los archivos de encabezado de cada stl; y los archivos de origen se compilan en una biblioteca (.so / static.a dinámica). El archivo de encabezado y la biblioteca correspondiente deben coincidir.

 

1. Archivos de encabezado y archivos de origen STL c ++

En Android, habrá diferentes rutas según el stl seleccionado:
ndk : prebuilts / ndk / current / sources / cxx-stl / llvm-libc ++ / include /
aosp: external / libcxx / include /

Los archivos de encabezado y los archivos de origen en STL se incluirán con las siguientes macros antes y después:

_LIBCPP_BEGIN_NAMESPACE_STD
// sources or headers
_LIBCPP_END_NAMESPACE_STD

_LIBCPP_BEGIN_NAMESPACE_STD y _LIBCPP_END_NAMESPACE_STD se definen en el archivo __config , y estas diferentes rutas STL contendrán sus propios archivos __config.

 

2. Definición de _LIBCPP_BEGIN_NAMESPACE_STD y _LIBCPP_END_NAMESPACE_STD [en __config ]

_LIBCPP_BEGIN_NAMESPACE_STD y _LIBCPP_END_NAMESPACE_STD definidos en el archivo __config en

#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE {
#define _LIBCPP_END_NAMESPACE_STD  } }

2.1 Definición de _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

Entonces, en el código fuente de Android _LIBCPP_NAMESPACE tiene dos definiciones:
  -. En libc ++ SO: __1
  - en libc ++ _ Shared: __ndk1
  
_LIBCPP_BEGIN_NAMESPACE_STD también tiene dos definiciones:
  - en libc ++ SO: namespace std {{inline namespace __1.   - in libc ++ _ shared.so: namespace std {inline namespace __ndk1 {

 

3. Conclusión

STL
en el código fuente de Android: espacio de nombres en libc ++ [archivo de encabezado: externo / libcxx / include /]:
  std :: __ 1
espacio de nombres en libc ++ _ shared [archivo de encabezado: prebuilts / ndk / current / sources / cxx-stl / llvm-libc ++ / incluir /】:
  std :: __ ndk1

Por lo tanto, errores como no poder encontrar variables / funciones en STL al compilar y vincular (especialmente palabras como espacio de nombres "std :: __ 1", "std :: __ ndk1", etc.), deben considerar el uso de la ruta / enlace del archivo de encabezado STL La biblioteca esperó por razones. Esto puede suceder cuando, por ejemplo, sus diferentes unidades de compilación se compilaron previamente por separado y usan STL inconsistente. Y si usa bibliotecas de terceros, debe comunicarse con ellos para usar un STL consistente; de ​​lo contrario, será más problemático depurar problemas inexplicables hasta el tiempo de ejecución.

 

Supongo que te gusta

Origin blog.csdn.net/thl789/article/details/109920740
Recomendado
Clasificación