您的位置:首页 > 其它

Ubuntu 虚拟机环境下配置 Clang/LLVM

2017-12-04 14:14 113 查看

流程

从本质上讲,Ubuntu 环境下配置 Clang/LLVM 与 VS 环境下的配置过程并无本质区别。Ubuntu 环境中具体流程如下所示(以 LLVM 4.0.0 为例):

从官网 LLVM Download Page 下载 Clang 源码 和 LLVM 源码,即 Sources 目录下前两项。注意,Clang 压缩包下载之后的包名叫做 cfe。然后,把 LLVM4.0.0 压缩包解压为 LLVM4.0.0,cfe 压缩包解压为 Clang 并把 Clang 目录移动到 LLVM4.0.0/tools 目录下;

使用 sudo apt install cmake 安装 cmake(windows 环境下 CMake 安装有 msi 格式安装程序);

在 LLVM4.0.0 同一父目录下新建目录 build,该目录用于存放 CMake 的构造产物(如 VS 环境下的解决方案 LLVM.sln)、源码编译生成的各种库以及各种 LLVM 工具最终的可执行文件;

在 build 目录下执行 cmake ../llvm -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_BUILD_TYPE=Debug。其中,命令中的 X86 可以改为 ARM、MSP430、MIPS 等其他平台,Debug 则说明生成的是 Debug 版本,也可以改成 Release 生成发行版本;

当步骤 4 出现 Configuring Done 以及 Generating Done 时,说明 CMake 构造成功,接着执行 make -j1(数字为 CPU 核数,由于我的虚拟机中只支持单核,因此数字是 1)进行编译。此步结束后 build/bin 目录下会出现很多二进制文件,至此我们的目的就达到了。

在安装过程中遇到的问题

问题一 : 虚拟机磁盘空间不足

在上述编译完成后,build 目录下的内容大小高达 10+GB。由于我事先只给虚拟机划分了 30GB 的空间,在上述编译过程中会出现磁盘空间不足的错误。因此,需要扩展虚拟机磁盘的空间。网上有很多增加硬盘空间的方法,只不过都太复杂了,容易出错。我是通过 gparted 软件扩展磁盘空间的,具体方法如下:

第一步: 在 VMWare 里扩展硬盘空间。在需要扩容的虚拟机处右键点开设置,选择“硬件 -> 硬盘(SCSI) -> 扩展(E)”。如下图所示,输入需要扩展的硬盘大小即可,这里是 50.0GB。要注意,这个操作只是增加 VMWare 分配的硬盘空间,但是这个空间暂时不可用,需要用分区软件调整一下分区才能正常使用;



图一 扩展硬盘空间

第二步: 使用 sudo apt install gparted 安装 gparted 软件,通过命令行方式划分分区,这种方式需要打开 root 权限。也可以在 GParted 里下载 iso 格式的 liveCD 镜像文件,然后在“硬件 -> CD/DVD(SATA) -> 使用 ISO 映像文件(M)”中选择所下载的 gparted 镜像。本操作的目的在于把镜像文件加载到 CD 中启动;



图二 载入 GParted 镜像文件

第三步: 上述步骤完成后启动虚拟机,如无意外可以看到 GParted 软件的启动画面,如图三所示。否则,需要进入 boot 修改启动的优先级顺序。点击 VMWare 界面上开机键旁边的小三角形可以打开开机复选框,在其中选择“打开电源时进入固件”即可进入 boot 界面,如图四所示。然后,进入 Boot 目录下,把 CD ROM 选项的优先级排成最高,也就是放在第一位。这样做之后进入虚拟机时会从 CD 中启动,从而载入 GParted 镜像文件;



图三 GParted 启动画面



图四 Boot 界面

第四步: 进入 GParted 软件启动页后,一直选择默认选项即可。当然,设置语言时可以选择你喜欢的语言,其他配置一律按 enter。最后会进入 GParted 软件的 GUI 界面,如图五所示。然后就可以开始扩展磁盘了,如果还有可以扩展的空间,这里都会显示出来,图五是扩展后的结果。在更改分区时要注意的是,第一分区(这里是 /dev/sda1)千万不要删。第一分区存放了计算机的操作系统,也是我要扩展的分区,选中 /dev/sda1 进行 resize 既可。有的电脑会发现很多 /dev/sda2,/dev/sda3,/dev/sda4,/dev/sda5 等等以及 swap 分区,这些是可以删除的。由于增加分区大小或是合并分区只能是相邻的分区,如果合并的分区不连续,可先删除中间的 swap 分区。最后,预留出等同于内存大小的空间作为 swap 分区(我在划分分区时忘记预留交换区了,这直接导致了本文第二个问题的出现)。上述更改操作完成后应用一下就可以了,重新进入虚拟机便可以发现磁盘空间变大了。



图五 GParted 界面

最后,别忘了把之前修改的 boot 顺序改回来。至此虚拟机磁盘扩容的操作完成!

问题二 : 交换区空间不足

问题一解决后继续编译 LLVM 源码,在链接生成 Clang 时出现了“collect2: ld terminated with signal 9”的 fatal error。经查,这是交换区空间不够所导致的问题。Clang 在链接时需要用到大量的中间文件,虚拟机的内存显然不足以存放所有的中间文件,因此需要大量使用交换区空间。由于我之前在给磁盘扩容时并未设置足够的交换区,所以出现了该 fatal error。我使用的手动增加交换分区的方法如下:

由于创建交换区用到的部分命令需要较高权限,先获取 root 权限:usrname@ubuntu:~$ sudo -i。退出 root 时只需要键入 exit 即可回到用户权限。

创建 4GB 的空文件: dd if=/dev/zero of=/tmp/swap1 bs=1M count=4096;

把 /tmp/swap1 格式化为交换分区:mkswap /tmp/swap1;

使用 free 命令查看交换分区大小: free

挂载交换分区:swapon /tmp/swap1;如果要去掉新增加的 swap 分区,使用“swapoff /tmp/swap1”即可。

上述流程完成后可以发现交换分区大小扩展成了 4GB,继续编译 LLVM 后再也没遇到问题,Clang 也链接成功了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  llvm ubuntu 安装