[建议原文查看]
因为这是我自己的网站
这篇文章教你如何编译内核为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就差不多编译完了
网友评论