首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LLVM在Android工具链中的用途是什么?

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

Stack Overflow用户
提问于 2019-02-20 11:19:14
回答 2查看 11.6K关注 0票数 9

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

简单回顾一下:

我在Ubuntu上用Gradlew构建我的本地项目,目标是arm和x86_64架构。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-工具链/home/mypc/Android/android-ndk-r17c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 -fpic -连接.节.风趣表.f堆栈-保护器-强-Wno-无效-命令行-参数.

下面是从x86_64/ndkBuild_build_output.log:中提取的..and

/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 -target x86_64-无-linux-android-功能-章节-有趣-表-fstack-保护器-强-fPIC -Wno-无效-命令行-参数.

  • “.”指示我修剪过的这个单行命令有一个长尾。
  • 更改了个人文件夹和项目的名称。

让我们看看Android的工具链文件夹中的内容:

代码语言:javascript
复制
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工具链中的实际用途是什么?

谢谢你的帮助:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-20 11:50:52

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 (构建过程使用的次要工具)仍在使用,而且每个体系结构也有一个副本(尽管它们在技术上可能跨架构工作)。

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

票数 16
EN

Stack Overflow用户

发布于 2019-02-21 06:56:12

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

对于Android,自从r13b和gcc被删除后,llvm就成为默认的工具链。

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

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

可能有用的参考资料:用于CMake构建工具链中“条带”命令的Android路径变量

更新

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

论r16b

代码语言:javascript
复制
--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 

论r17c

代码语言:javascript
复制
--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

论r18b

代码语言:javascript
复制
--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

论r19b

代码语言:javascript
复制
--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,即toolchains/llvm/prebuilt/darwin-x86_64,并且将使用"llvm版本“的头文件和库(例如ranlib、ar、strip等)。

另外,请注意,toolchains/llvm/prebuilt/darwin-x86_64包含对所有Android的支持,即aarch64-linux-android for arm64-v8aarm-linux-androideabi for arm-linux-androideabi i686-linux-android for x86x86_64-linux-android for E 134x86_64E 235

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54785091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档