前言
- OLLVM是什么就不详细说了,懂的自然懂,不懂的也不会来到这篇文章;
- 目前网上暂时没有关于最新版ollvm的移植和食用过程,都是几年前的老文章,搬来搬去;
笔者写这篇文章的时候 llvm 的最新版是14.x,适不适合以后的版本就不清楚了;
在这里感谢 heroims 大佬的 ollvm-13.x 的移植教程和修改
话不多说,直接开撸(❁´◡`❁)
准备环境
- cmake
大项目都离不开它,大家最熟悉不过了,去官网下载安装就行。
Tips:用 AndroidStudio 提供的也行,直接配置环境变量即可
- llvm-mingw64
笔者不用传统的gcc,个人喜欢 llvm 的 clang 工具
- llvm-mingw64
如果你用的是 AndroidStudio 里的 Cmake 并配置了环境变量的话,这步可以忽略,否则点击上方链接下载并配置环境变量(方法同上)。
随便夸一下 ninja ,比 make 好用多了,编译起来嘎嘎滴爽!(笔者个人看法)
克隆并移植代码
官方llvm-project:https://github.com/llvm/llvm-project
个人移植的ollvm-project:https://github.com/yangyiyu08/ollvm-project
小声求个 star 哈哈
移植教程就不写了,去仓库里的 14.x 分支看 commit 会一清二楚~
编译
来了,最重要的编译流程,一步步下来如果姿势正确都会编译通过的
- 进入到 (o)llvm-project 文件夹(官方的没有o这个字母)
- 按住 shift + 鼠标右键后打开 PS ,输入命令行进行构建 Cmake 配置
cmake -S llvm -B build -G Ninja -DLLVM_ENABLE_PROJECTS="clang" -DCMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TESTS=OFF -DLLVM_ENABLE_NEW_PASS_MANAGER=OFF
这里解释一下参数
-G Ninja:使用 ninja 进行编译源码
-DLLVM_ENABLE_PROJECTS="clang":启用clang,有多个选择 但我们只需要clang,官方文档有说明
-DCMAKE_BUILD_TYPE=Release:构建 release 版本,比 debug 版本编译快很多
-DLLVM_INCLUDE_TESTS=OFF:关闭 llvm 的头文件测试,也是为了加快编译速度
-DLLVM_ENABLE_NEW_PASS_MANAGER=OFF:这个非常重要,llvm-12.x 开始默认使用 newPM进行编译源码,导致 ollvm 不起作用!因此,需要加上这个参数禁用掉 newPM。(虽然可以用 -flegacy-pass-manager 让 llvm 不走 newPM 编译,但是...你不觉得在你的源码上加一串怎么长的命令很难受吗) -
执行以上命令后若显示 Configuration done. 则配置成功
注意:执行命令前必须安装好 git 和 python ,特别是python。
别问为什么,问就是不安装不让编译!! -
接下来就是漫长的源码编译了,主要是看电脑配置吧
cmake --build build -j16
-j16:线程数,根据自己的电脑配置进行修改,别太高了
总共 4k+ 个obj,等待编译完成即可 -
漫长的等待后,没意外的话编译完成了,接下来为 AndroidStudio 的 NDK 配置 ollvm
整合进NDK
- 覆盖 NDK 里的 clang.exe clang++.exe clang-cl.exe
细心的人可能会发现两个问题:其一是文件大小一样,其二就是文件很大。
首先,这三个文件就是同一个文件复制出来的,没错,漫长的等待就为了clang.exe;
其次,文件太大是因为没有将其“瘦身”,可以使用 strip clang.exe clang++.exe clang-cl 命令来压缩体积。 - 复制 lib 库
经第一步覆盖后,打开AS编译项目会报找不到 libunwind 等库的错,原因就是缺少lib/clang/...这些库
其实这些库 NDK 里面已经存在,只是路径不对,ctrl c+v就能解决了
将 lib64 里的 clang 复制到 lib 目录后,还需要注意一个细节,就是 clang 的版本。
我的最新 NDK 里的 clang 版本是14.0.1(不知道哪来的14.0.1,官方也就14.0.0)
因此需要重命名一下版本文件夹,版本相同的可以忽略,如下图:
写在最后
至此,OLLVM已经完成编译和整合,具体用法可以到网上搜。
如果你觉得编译很麻烦,那你可以到我移植好的仓库直接下载成品,将 clang.exe 多复制出 clang++.exe和clang-cl.exe 后替换即可。
如果你觉得这篇文章对你有帮助,可否给仓库一个 star 嘿嘿