交叉編譯clang/llvm for android armeabi
ofollow,noindex">原文
[建議原文檢視]
因為這是我自己的網站
這篇文章教你如何編譯核心為Android Armeabi的clang
neoterm自帶的clang
編譯準備
• 準備SDK
這裡是 SDK下載地址 ,由於官方需要翻牆,這裡放的是第三方下載站
PS:這裡還有其他的工具,比如NDK
• 準備LLVM原始碼
這裡是 LLVM官方地址
下載最新版本的『LLVM原始碼』和『Clang原始碼』
這裡演示的版本為7.0.0
開始編譯
1
解壓剛剛下載好的llvm-7.0.0.src.tar.xz,放在一個你喜歡的路徑
我放在$HOME/文件/
因為空間大
此時應該是$HOME/文件/llvm-7.0.0/
2
解壓剛剛下載好的sdk
我還是放在文件裡
取名為android-sdk-linux
此時應該是$HOME/文件/android-sdk-linux/
3
解壓cfe-7.0.0.src.tar.xz,把他重新命名為clang,並放在llvm資料夾的tools資料夾內
此時應該是$HOME/文件/llvm-7.0.0/tools/clang/
一個配置低的操作
編輯llvm/tools/LLVMBuild.txt,把subdirectories後面的統統刪掉,然後加個clang
此時應該是
[common]
subdirectories =
clang
[component_0]
type = Group
name = Tools
parent = $ROOT
接著進入clang資料夾,新建一個檔案,取名為LLVMBuild.txt
內容是
[component_0]
type = Tool
name = clang
parent = Tools
required_libraries = Supporthttp://releases.llvm.org/download.html
然後刪除tools資料夾下的除clang資料夾以外的其他資料夾
這樣llvm只編譯clang了
4
在llvm的同一級下新建一個資料夾,取名為build
因為llvm不允許直接在自己的原始碼內編譯
這樣會覆蓋原始碼
此時應該是$HOME/文件/build/*
5
在一切都準備好之後,就可以開始寫cmake引數了
在llvm同一級下創造一個檔案,取名為llvm.sh
chmod +x llvm.sh
使這個檔案可以被執行
6
開啟llvm.sh
接下來劃重點
/home/wddsauo/文件/android-sdk-linux/cmake/3.6.4111459/bin/cmake \
-Bbuild "$PWD/../llvm-7.0.0" \
-DANDROID_PLATFORM="android-23" \
-DANDROID_STL="c++_shared" \
-DANDROID_CPP_FEATURES="rtti exceptions" \
-DANDROID_ARM_MODE="arm" \
-DANDROID_NDK="$HOME/文件/android-sdk-linux/ndk-bundle" \
-DANDROID_TOOLCHAIN="clang" \
-DANDROID_NATIVE_API_LEVEL=23 \
-DANDROID_ALLOW_UNDEFINED_SYMBOLS=TRUE \
-DANDROID_ARM_NEON=TRUE \
-DANDROID_DISABLE_FORMAT_STRING_CHECKS=FALSE \
-DANDROID_PIE=ON \
-DCMAKE_SYSTEM_NAME="Android" \
-DCMAKE_BUILD_TYPE="Release" \
-DCMAKE_TOOLCHAIN_FILE="$HOME/文件/android-sdk-linux/ndk-bundle/build/cmake/android.toolchain.cmake" \
-DCMAKE_C_FLAGS="-std=c11" \
-DCMAKE_CXX_FLAGS="-std=c++14 -D_LIBCPP_STD_VER=14"
必須執行sdk裡的cmake,因為google對其修改了原始碼
位置在android-sdk-linux/cmake/3.6.4111459/bin/cmake
• Build 後面寫的是需要編譯的原始碼位置
• ANDROID_PLATFORM 指定目標Android平臺的名稱
• ANDROID_STL 指定應使用的STL
CMake 引數如下
引數|作用
none|No C++ Support
system|Minimal C++ without STL
gabi++_static|GAbi++ Static
gabi++_shared|GAbi++ Shared
gnustl_static|GNU libstdc++ Static
gnustl_shared|GNU libstdc++ Shared
c++_static|LLVM libc++ Static
c++_shared|LLVM libc++ Shared
stlport_static|STLport Static
stlport_shared|STLport Shared
官方預設的是c++_static
• ANDROID_CPP_FEATURES 指定CMake在編譯本機庫時需要使用的某些C++特性 引數只有兩個
引數|作用
rtti|表明程式碼使用RTTI
exceptions|C++異常
• ANDROID_ARM_MODE 指定是否以arm或thumb模式生成ARM目標二進位制檔案
• ANDROID_ARM_NEON 指定CMake是否應構建具有NEON支援的本機庫 API23以上填TRUE,以下填FALSE
• ANDROID_NDK 指定NDK安裝的絕對路徑 這裡SDK已經自帶了NDK了 填sdk資料夾裡的ndk-bundle就好了
• ANDROID_NATIVE_API_LEVEL 指定CMake編譯的Android API級別
• ANDROID_ALLOW_UNDEFINED_SYMBOLS 指定如果CMake在構建本機庫時遇到未定義的引用,是否丟擲未定義的符號錯誤 禁用為TRUE
這個必須TRUE,不然後面會有好多什麼std::__ndk1的奇怪的未定義錯誤
• CMAKE_SYSTEM_NAME 指定CMake編譯的名稱 填Android就好了
• CMAKE_BUILD_TYPE 編譯的型別 Release和Debug 選一個喜歡的
• CMAKE_TOOLCHAIN_FILE 指定CMake用於Android交叉編譯的檔案的路徑
• CMAKE_C_FLAGS和CMAKE_CXX_FLAGS作用我就不說了,表明一個用c11一個用c++14
7
進入之前新建的build資料夾
cd $HOME/文件/build
在build資料夾裡執行llvm.sh
./../llvm.sh
等出現 Build files have been written to: xxxxxxx 就是成功了
8
make -j2
開始編譯吧,j後面的寫的是你的cpu核數
llvm編譯的十分的慢
請耐心等待
9
make install -j2
這個時候clang就差不多編譯完了