在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的工具链文件夹中的内容:
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工具链中的实际用途是什么?
谢谢你的帮助:)
发布于 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部分。
发布于 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
--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
--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
--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
--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-v8a、arm-linux-androideabi for arm-linux-androideabi i686-linux-android for x86、x86_64-linux-android for E 134x86_64E 235。
因此,如果您想纯粹使用llvm工具链,可以尝试使用NDK .。
https://stackoverflow.com/questions/54785091
复制相似问题