美文网首页程序员
交叉编译clang/llvm for android armea

交叉编译clang/llvm for android armea

作者: Wddsauo | 来源:发表于2018-11-25 01:13 被阅读6次

    原文

    [建议原文查看]

    因为这是我自己的网站


    这篇文章教你如何编译内核为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就差不多编译完了

    相关文章

      网友评论

        本文标题:交叉编译clang/llvm for android armea

        本文链接:https://www.haomeiwen.com/subject/lpmuqqtx.html