TypeCodes

CentOS7.3使用CMake编译安装最新的LLVM和Clang4.0.1

前段时间试了把虚拟机CentOS下面的C/C++工程中的Makefile文件改用clang/clang++来编译,这篇文章主要是介绍如何在CentOS7.3系统编译安装最新的LLVM和Clang4.0.1。

关于GCC、LLVM和Clang关系可以参考《这篇文章》,个人的理解如下:

LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。

而从clang官网的介绍可以看出,clang的目标是创建一种新的基于C语言的LLVM编译器的前端(应该是提供词法分析、语法检测等功能)。

The goal of the Clang project is to create a new C based language front-end: C, C++, Objective C/C++, OpenCL C and others for the LLVM compiler.

1 下载编译所需的文件

从clang官网上下载包含llvm、clang和libcxx等7个文件:

[root@typecodes ~]# wget -c http://releases.llvm.org/4.0.1/llvm-4.0.1.src.tar.xz
[root@typecodes ~]# wget -c http://releases.llvm.org/4.0.1/cfe-4.0.1.src.tar.xz
[root@typecodes ~]# wget -c http://releases.llvm.org/4.0.1/clang-tools-extra-4.0.1.src.tar.xz
[root@typecodes ~]# wget -c http://releases.llvm.org/4.0.1/compiler-rt-4.0.1.src.tar.xz
[root@typecodes ~]# wget -c http://releases.llvm.org/4.0.1/libcxx-4.0.1.src.tar.xz
[root@typecodes ~]# wget -c http://releases.llvm.org/4.0.1/libcxxabi-4.0.1.src.tar.xz
[root@typecodes ~]# wget -c http://releases.llvm.org/4.0.1/libunwind-4.0.1.src.tar.xz

2 解压所有文件到目录:llvm

2.1、解压 llvm-4.0.1.src.tar.xz

[root@typecodes ~]# tar -xf llvm-4.0.1.src.tar.xz && mv -f llvm-4.0.1.src llvm && rm -rf llvm-4.0.1.src.tar.xz

2.2、解压 cfe-4.0.1.src.tar.xz

[root@typecodes ~]# cd llvm/tools/ && mv ~/cfe-4.0.1.src.tar.xz .
[root@typecodes tools]# tar -xf cfe-4.0.1.src.tar.xz && mv -f cfe-4.0.1.src clang && rm -rf cfe-4.0.1.src.tar.xz

2.3、解压 clang-tools-extra-4.0.1.src.tar.xz

[root@typecodes tools]# cd clang/tools/ && mv ~/clang-tools-extra-4.0.1.src.tar.xz .
[root@typecodes tools]# tar -xf clang-tools-extra-4.0.1.src.tar.xz && mv -f clang-tools-extra-4.0.1.src extra && rm -rf clang-tools-extra-4.0.1.src.tar.xz

2.4、进入projescts目录

[root@typecodes tools]# cd ../../../projects/ && pwd
/root/llvm/projects
[root@typecodes projects]#

2.5、解压 compiler-rt-4.0.1.src.tar.xz

[root@typecodes projects]# mv ~/compiler-rt-4.0.1.src.tar.xz .
[root@typecodes projects]# tar -xf compiler-rt-4.0.1.src.tar.xz && mv -f compiler-rt-4.0.1.src compiler-rt && rm -rf compiler-rt-4.0.1.src.tar.xz

2.6、解压 libcxx-4.0.1.src.tar.xz

[root@typecodes projects]# mv ~/libcxx-4.0.1.src.tar.xz .
[root@typecodes projects]# tar -xf libcxx-4.0.1.src.tar.xz && mv -f libcxx-4.0.1.src libcxx && rm -rf libcxx-4.0.1.src.tar.xz

2.7、解压 libcxxabi-4.0.1.src.tar.xz

[root@typecodes projects]# mv ~/libcxxabi-4.0.1.src.tar.xz .
[root@typecodes projects]# tar -xf libcxxabi-4.0.1.src.tar.xz && mv -f libcxxabi-4.0.1.src libcxxabi && rm -rf libcxxabi-4.0.1.src.tar.xz

2.8、解压 libunwind-4.0.1.src.tar.xz

[root@typecodes projects]# mv ~/libunwind-4.0.1.src.tar.xz .
[root@typecodes projects]# tar -xf libunwind-4.0.1.src.tar.xz && mv -f libunwind-4.0.1.src libunwind && rm -rf libunwind-4.0.1.src.tar.xz

3 创建CMake的编译目录:build

[root@typecodes projects]# cd ~/ && mkdir build && cd build/

4 使用Cmake编译生成makefile文件

如果想clang/clang++自动使用libc++库,那么在编译clang时就需要指定DCLANG_DEFAULT_CXX_STDLIB参数值为libc++,否则在链接的时候自动使用gcc/g++的libstdc++库。当然,也可以每次在用clang/clang++编译程序的时候指定--stdlib=libc++

[root@typecodes build]# cmake -G "Unix Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCLANG_DEFAULT_CXX_STDLIB=libc++ -DCMAKE_BUILD_TYPE="Release" ../llvm

关于glibc、libstdc++和libc+++这三个库的关系,可以参考文章《理清gcc、libc、libstdc++的关系》。前两者是gcc/g++编译C/C++默认链接的库文件,libc+++是clang需要链接的库文件。

使用Cmake编译生成makefile文件

5 开始通过make命令编译

使用make -j2命令进行编译。

使用make -j2编译

6 安装 clang 和 llvm

使用命令make install进行安装。

使用make install进行安装

使用make install进行安装

7 安装 libcxx 和 libcxxabi

使用命令make install-cxx install-cxxabi安装clang/clang++所需要的libc++库。

安装 libcxx 和 libcxxabi

8 查看clang/clang++版本

使用如下命令查看clang/clang++版本:

[root@typecodes build]# clang --version
clang version 4.0.1 (tags/RELEASE_401/final)Target: x86_64-unknown-linux-gnuThread model: posixInstalledDir: /usr/local/bin
[root@typecodes build]#

[root@typecodes build]# clang++ --version
clang version 4.0.1 (tags/RELEASE_401/final)Target: x86_64-unknown-linux-gnuThread model: posixInstalledDir: /usr/local/bin
[root@typecodes build]#

9 查看安装位置

使用如下命令查看clang/clang++安装的位置:

[root@typecodes build]# which clang
/usr/local/bin/clang
[root@typecodes build]#

[root@typecodes build]# which clang++
/usr/local/bin/clang++
[root@typecodes build]#

10 查看LLVM的配置

使用llvm-config --bindir --includedir --libdir --cmakedir命令查看llvm的配置信息。

使用llvm-config查看LLVM的配置

11 使用clang++编译c++程序

clang/clang++目前是兼容gcc/g++的,所以二者的编译命令基本一致。

[vfhky@typecodes ~]$ clang++ hello.cpp -Wall -g -o hello

如果在小节4中没有指定DCLANG_DEFAULT_CXX_STDLIB参数的值,那么在编译的时候需要使用如下命令:

[vfhky@typecodes ~]$ clang++ hello.cpp -Wall -g -o hello --stdlib=libc++

12 错误分析

从下面这个错误信息可以知道:LLVM最新的4.0.1版本已经不能通过configure/make来编译安装了,它只支持CMake编译。

[root@typecodes build]# ../llvm/configure  --enable-optimized --enable-targets=host-only CC=gcc CXX=g++################################################################################################################################################################The LLVM project no longer supports building with configure & make.​Please migrate to the CMake-based build system.For more information see: http://llvm.org/docs/CMake.html################################################################################################################################################################
[root@typecodes build]#
打赏支持

Comments »