编译android版本llvm编译器
准备
编译环境:ubuntu 20.04.2
编译器版本:ndk-24.0.8215888
llvm版本: 15.0.7
最近需要在android上编译C++项目,需要在android上使用arm版本的编译工具
1. 下载需要版本的llvm,切换到指定版本 本人编译的15.0.7
git clone --recursive https://github.com/llvm/llvm-project
2. 修改CMake脚本屏蔽Pass相关链接错误
cd llvm-project/llvm/lib/Transforms
- 修改CMakeLists.txt 如下:
add_llvm_library( LLVMHello MODULE BUILDTREE_ONLY
Hello.cpp
DEPENDS
intrinsics_gen
PLUGIN_TOOL
opt
)
==>> 改为:
if(NOT ANDROID)
add_llvm_library( LLVMHello MODULE BUILDTREE_ONLY
Hello.cpp
DEPENDS
intrinsics_gen
PLUGIN_TOOL
opt
)
endif()
cd llvm-project/llvm/tools/bugpoint-passes
- 修改CMakeLists.txt 文件如下:
add_llvm_library( BugpointPasses MODULE BUILDTREE_ONLY
TestPasses.cpp
DEPENDS
intrinsics_gen
bugpoint
)
==>> 改为:
if(NOT ANDROID)
add_llvm_library( BugpointPasses MODULE BUILDTREE_ONLY
TestPasses.cpp
DEPENDS
intrinsics_gen
bugpoint
)
endif()
cd llvm/examples/Bye
- 修改CMakeLists.txt 文件如下:
add_llvm_pass_plugin(Bye
Bye.cpp
DEPENDS
intrinsics_gen
BUILDTREE_ONLY
)
install(TARGETS ${name} RUNTIME DESTINATION "${LLVM_EXAMPLES_INSTALL_DIR}")
set_target_properties(${name} PROPERTIES FOLDER "Examples")
==>>改为:
if (NOT WIN32 AND NOT ANDROID)
add_llvm_pass_plugin(Bye
Bye.cpp
DEPENDS
intrinsics_gen
BUILDTREE_ONLY
)
install(TARGETS ${name} RUNTIME DESTINATION "${LLVM_EXAMPLES_INSTALL_DIR}")
set_target_properties(${name} PROPERTIES FOLDER "Examples")
endif()
3. 下载android ndk 配置到环境变量
export ANDROID_NDK=/home/feiker/Android/Sdk/ndk/24.0.8215888/
4. 编辑shell文件 build_android.sh
build_llvm=`pwd`/build-llvm
build_clang=`pwd`/build-clang
installprefix=`pwd`/install
LLVM_DIR=`pwd`/llvm-project
mkdir -p $build_llvm
mkdir -p $installprefix
cmake -G Ninja -S $LLVM_DIR/llvm -B $build_llvm \
-DLLVM_INSTALL_UTILS=ON -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi" \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="arm64-v8a" -DANDROID_PLATFORM=android-24 \
-DCMAKE_INSTALL_PREFIX=$installprefix \
-DLLVM_INCLUDE_TESTS=OFF \
-DLLVM_BUILD_TESTS=OFF \
-DLLVM_INCLUDE_BENCHMARKS=OFF \
-DCMAKE_BUILD_TYPE=Release
ninja -C $build_llvm install -j19
5. 执行编译脚本
sh build_android.sh
6. 拷贝到android并运行
//连接设备
adb connect 192.19.0.89
//拷贝到设备上
adb push ./install /data/local/tmp
//编译cpp文件,报错提示一些头文件不存在
./bin/clang++ main.cc -I include/c++/v1
//拷贝sysroot目录下的usr文件夹到install目录
adb push sysroot/usr /data/local/tmp/install/
//执行
./bin/clang++ main.cc -I include/c++/v1 -I usr/include -I usr/local/include -I usr/include/aarch64-linux-android
//提示ld工具找不到
需要arm64版本的binutils工具,参考另一篇博客编译android版本binutils