当前位置: 首页 > 知识库问答 >
问题:

什么是LLVM在Android NDK工具链的用途?

国盛
2023-03-14

什么是LLVM在Android NDK工具链的用途?

简单回顾一下:

我在Ubuntu上用Gradlew构建我的原生项目,目标是arm和x86_64体系结构。似乎LLVM被用来调用arm-linux-AndroidABI-4.9的C/C编译器以及x86_64(?)

以下内容摘自armeabi-v7a/ndkBuild_build_输出。日志:

/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-工具链 /home/mypc/Android/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/预构建/linux-x86_64-fpic-ffunction-节-funWind-表-fstack-保护者-强-Wno-无效-命令-行-参数...

..以下内容摘自x86_64/ndkBuild_build_输出。日志:

/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-工具链 /home/mypc/Android/android-ndk-r17c/toolchains/x86_64-4.9/prebuilt/linux-x86_64-Targetx86_64-not-linux-android-ffunction-的章节-funWind-表-fstack-Protector-strong-fPIC-Wno-无效-命令行-参数...

  • “…”表明我删掉的这条单行命令有一条长尾
  • 个人文件夹的名称

让我们看看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是一种工具链,因为它放在这里,紧挨着其他工具链。再说一次,LLVM在Android NDK工具链中的实际用途是什么?

谢谢你的帮助:)

共有2个答案

田博易
2023-03-14

LLVM现在是一个umbrela项目,它包含多个模块化、可重用的编译器和工具链技术。您可以在LLVM编译器基础设施上查看更多详细信息。

对于Android NDK,llvm从r13b开始成为默认工具链,gcc从r18b开始被删除。

根据工具链目录Toolchain/llvm/prebuild/darwin-x86_64,llvm支持所有的ABI,即x86、x86_64、arm、arm64。

在未来的NDK版本中,当所有与gcc相关的工具、头和库都完全移植到llvm时,toolschains目录下可能只有一个llvm目录。

可能有帮助的参考文献:AndroidNDK路径变量,用于CLet构建工具链中的“条”命令

刚刚对不同的NDK版本进行了快速测试,以检查用于交叉编译的--gcc工具链--sysroot的配置。

--target=armv7-none-linux-androideabi 
--gcc-toolchain=~/ndks/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r16b/sysroot 
--target=armv7-none-linux-androideabi
--gcc-toolchain=~/ndks/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r17c/sysroot
--target=armv7-none-linux-androideabi19
--gcc-toolchain=~/ndks/android-ndk-r18b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64
--sysroot=~/ndks/android-ndk-r18b/sysroot
--target=armv7-none-linux-androideabi19 
--gcc-toolchain=~/ndks/android-ndk-r19b/toolchains/llvm/prebuilt/darwin-x86_64 
--sysroot=~/ndks/android-ndk-r19b/toolchains/llvm/prebuilt/darwin-x86_64/sysroot 

如上所述,在NDK r19b之前,NDK使用clang编译器,但是--gcc-Toolchain--sysroot被配置为构建工具、标头和库的旧路径。

但是,由于NDK r19b,所以将--gcc-Toolchain--sysroot配置为新的工具链llvm,即Toolchain/llvm/prebuild/darwin-x86_64,以及工具(例如ranlib、ar、条带等)的头将使用"llvm版本"的文件和库。

另外,请注意,toolschains/llvm/prebuild/darwin-x86_64包含对所有Android ABI的支持,即对于arm64-v8a,aarch64-linux-Android对于armeabi-v7a,i686-linux-Android对于x86_64,x86_64-linux-Android

因此,如果您想纯粹使用llvm工具链,可以尝试NDK r19b。

束建章
2023-03-14

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

以前,NDK使用GCC作为编译器。对于GCC,每个目标体系结构(arm、aarch 64、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的构建计算机的可执行文件,因此是路径的预构建/linux-x86_64部分。

 类似资料:
  • 问题内容: LLVM在Android NDK工具链中的用途是什么? 简要回顾一下: 我在Ubuntu上使用Gradlew构建本地项目,目标是arm和x86_64体系结构。似乎利用 LLVM 来调用 arm-linux- androideabi-4.9 和 x86_64 (?)的C / C ++编译器 以下内容摘自 armeabi-v7a / ndkBuild_build_output.log: /

  • Android-ndk\toolchains\arm-linux-androideabi-4.4.3对于x86,使用路径:Android-ndk\toolchains\x86-4.4.3有关更多信息,请参见位于Android-ndk/docs/standalone-toolchain.html中的NDK文档。 但是,从这个简短的描述中,我不明白什么是工具链兼容性问题。我想知道是否有人能更详细地向我

  • 本文向大家介绍Java 9中jdeprscan工具的用途是什么?,包括了Java 9中jdeprscan工具的用途是什么?的使用技巧和注意事项,需要的朋友参考一下 以下是jdeprscan工具的语法 。 在下面,我们为jdeprscan 工具提供了不同的选项 :

  • 本文向大家介绍iOS里什么是响应链,它是怎么工作的?相关面试题,主要包含被问及iOS里什么是响应链,它是怎么工作的?时的应答技巧和注意事项,需要的朋友参考一下 iOS里什么是响应链,它是怎么工作的? 第一反应就是,响应链就是响应链啊,由一串UIResponder对象链接,收到响应事件时由上往下传递,直到能响应事件为止。 但其中却大有文章... 1.由一串UIResponder对象链接 ? 我们知道

  • 我想使用gradel()编译一个开源的android项目(Netguard),但我遇到了这个错误: 我苦苦思索,但没有找到任何帮助。以下是主要的:

  • 问题内容: 在过去的一年中,我听说有关Scala语言的炒作越来越多。我知道有几个现有项目计划将Scala支持与IDE集成在一起。但是,并不总是很清楚集成到底有多好。 他们当前是否支持Intellisense以及Eclipse和Netbeans是否支持Java语言?他们还支持即时验证吗? 问题答案: 我不能亲自谈谈IntelliJ或NetBeans插件的稳定性(尽管我听过很多好消息),但是用于Ecl