田海立@CSDN 2020-11-22
《Android原始碼中的c++ STL》中講到Android Source中有內置的LLVM c++ STL和NDK的c++ STL,使用到這兩個stl的時候如何區分呢?c++是用namespace隔離的,stl也是這樣隔離的,本文逐步分析STL中如何用namespace隔離這兩個STL,這也同時可以解惑stl使用者使用時找不到stl中的標號的問題的原因,
應用使用stl,首先要有STL的原型,這些在各個stl的頭檔案里;而源檔案被編譯成庫(動態.so/靜態.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有兩個定義:
- in libc++.so: __1
- in libc++_shared: __ndk1
_LIBCPP_BEGIN_NAMESPACE_STD也就有兩個定義:
- in libc++.so: namespace std {inline namespace __1 {
- in libc++_shared.so: namespace std {inline namespace __ndk1 {
3. 結論
Android原始碼中的STLs:
namespace in libc++【頭檔案: external/libcxx/include/】:
std::__1
namespace in libc++_shared【頭檔案: prebuilts/ndk/current/sources/cxx-stl/llvm-libc++/include/】:
std::__ndk1
所以,在編譯鏈接時出現找不到STL中的變數/函式等錯誤(特別出現了namespace “std::__1”,“std::__ndk1”等字眼),要考慮使用STL的頭檔案路徑/鏈接庫等原因了,這會在諸如你的不同編譯單元之前是單獨編譯的,而它們使用了的不一致的STL時出現,而如果使用到第三方庫,需要與他們溝通使用一致的STL,不然等到運行時再出現莫名其妙的問題除錯起來就更麻煩了,
CSDN認證博客專家
系統分析師
Android
人工智能
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/226902.html
標籤:其他
上一篇:iOS 解決鍵盤遮擋輸入框問題,輸入框隨鍵盤彈起上移,切換輸入法時動態調整 (Swift)
下一篇:Android開發經驗總結
