在Android NDK工具链中使用LLVM有什么用?
一点回顾:
我在Ubuntu上使用Gradlew构建我的本机项目,目标是arm和x86_64架构.似乎LLVM被用来调用arm-linux-androideabi-4.9的c / C编译器以及x86_64(?)
以下内容摘自armeabi-v7a / ndkBuild_build_output.log:
/home/mypc/Android/android-ndk-r17c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++
-MMD -MP -MF /home/mypc/git/android-project-1/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/objs-debug/module-5/stream_cpp.o.d
-gcc-toolchain /home/mypc/Android/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
-fpic -ffunction-sections -funwind-tables -fstack-protector-strong -Wno-invalid-command-line-argument …
..以下是从x86_64 / ndkBuild_build_output.log中提取的:
/home/mypc/Android/android-ndk-r17c/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++
-MMD -MP -MF /home/mypc/git/android-project-1/build/intermediates/ndkBuild/debug/obj/local/x86_64/objs-debug/module-5/stream_cpp.o.d
-gcc-toolchain /home/mypc/Android/android-ndk-r17c/toolchains/x86_64-4.9/prebuilt/linux-x86_64
-target x86_64-none-linux-android -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC -Wno-invalid-command-line-argument …
>“……”表示这个单行命令的长尾我已经被删除了.
>个人文件夹名称&项目改变了.
让我们来看看Android NDK的工具链文件夹中的内容:
myacc:~/.../android-ndk-r17c/toolchains$tree -L 1
.
├── aarch64-linux-android-4.9
├── arm-linux-androideabi-4.9
├── llvm
├── mips64el-linux-android-4.9
├── mipsel-linux-android-4.9
├── NOTICE-MIPS
├── NOTICE-MIPS64
├── renderscript
├── x86-4.9
└── x86_64-4.9
这让我很困惑.我认为llvm是一种工具链,因为它放在这里,旁边是其他工具链.再次,在Android NDK工具链中实际使用LLVM是什么?
谢谢您的帮助 :)
解决方法:
LLVM是编译器(后端).使用的编译器是Clang,它位于llvm目录中. (LLVM是Clang组件的名称,用于执行实际的代码生成,即后端.)
以前,NDK使用GCC作为编译器.使用GCC,每个目标体系结构(arm,aarch64,x86等)都有一个单独的GCC副本,该副本是使用配置的单个目标构建的.另一方面,Clang / LLVM可以使用单个编译器可执行文件来定位任何已配置的体系结构.因此,使用Clang,您将节省一些磁盘空间,避免使用许多单独的编译器可执行文件.这就是为什么llvm目录树只有一个副本.
在NDK r17中,您可以使用GCC和Clang编译器;默认情况下使用Clang,但GCC仍可用于尚未能使用Clang迁移的项目.在较新的NDK版本中,旧的GCC被删除.
在较新的NDK版本中,即使删除了GCC,仍然会保留像aarch64-linux-android-4.9这样的体系结构特定目录,因为GNU binutils(构建过程使用的小工具)仍在使用,而且那些也来了每个体系结构一个副本(即使它们在技术上可能跨架构工作).
至于为何建造例如手臂也提到了x86_64;当您运行Clang或GCC时,您正在为运行x86_64的构建计算机运行可执行文件,因此预构建的/ linux-x86_64部分路径.