Android NDK 工具链中的 LLVM 有什么用?

2023-11-21

Android NDK 工具链中的 LLVM 有什么用?


稍微回顾一下:

我正在 Ubuntu 上使用 Gradlew 构建我的本机项目,目标是 arm 和 x86_64 架构。看来LLVM用于调用C/C++编译器ARM-Linux-AndroidEabi-4.9x86_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-无效的命令行参数 ...

..以下内容摘自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 -目标x86_64-none-linux-android -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC -Wno-invalid-command-line-argument ...

  • “...”表示这个单行命令的长尾部分已被我修剪掉。
  • 个人文件夹和项目的名称已更改。

我们来看看Android NDK里面有什么工具链 folder:

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是一种工具链,因为它放置在这里,与其他工具链相邻。再说一遍,LLVM 在 Android NDK 工具链中的实际用途是什么?

谢谢您的帮助 :)


LLVM 是编译器(后端)。使用的编译器是 Clang,它位于 llvm 目录中。 (LLVM 是执行实际代码生成的 Clang 组件的名称,也称为后端。)

此前,NDK 使用 GCC 作为编译器。使用 GCC,每个目标架构(arm、aarch64、x86 等)都有一个单独的 GCC 副本,该副本是使用配置的单个目标构建的。另一方面,Clang/LLVM 可以使用单个编译器可执行文件来定位任何配置的架构。因此,使用 Clang,您将节省一些磁盘空间,避免拥有许多单独的编译器可执行文件。这就是为什么 llvm 目录树只有一份副本的原因。

在 NDK r17 中,您可以使用 GCC 和 Clang 编译器;默认情况下使用 Clang,但对于尚未迁移到使用 Clang 的项目,GCC 仍然可用。在较新的 NDK 版本中,旧的 GCC 已被删除。

在较新的 NDK 版本中,即使删除了 GCC,特定于体系结构的目录如aarch64-linux-android-4.9仍然保留,因为 GNU binutils(构建过程中使用的次要工具)仍在使用,并且每个架构也有一份副本(即使它们在技术上可能跨架构工作)。

至于为什么要建造例如arm还提到了x86_64;当您运行 Clang 或 GCC 时,您正在为运行 x86_64 的构建计算机运行可执行文件,因此prebuilt/linux-x86_64路径的一部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android NDK 工具链中的 LLVM 有什么用? 的相关文章

随机推荐