gpt4 book ai didi

android - LLVM 在 Android NDK 工具链中有什么用?

转载 作者:IT王子 更新时间:2023-10-29 01:05:39 79 4
gpt4 key购买 nike

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


小回顾:

我在 Ubuntu 上使用 Gradlew 构建我的原生项目,目标是 arm 和 x86_64 架构。似乎LLVM被用来调用arm-linux-androideabi-4.9x86_64的C/C++编译器(?)

以下内容摘自 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 的 toolchains 文件夹里有什么:

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,但 GCC 仍可用于尚未能够迁移到使用 Clang 的项目。在较新的 NDK 版本中,旧的 GCC 已被删除。

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

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

关于android - LLVM 在 Android NDK 工具链中有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54785091/

79 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com