前言
一、LLVM是什么?
二、使用步骤
1.升级CMake
2.升级GCC
3.下载LLVMClang相关源码
4.安装OpenMP库并链接
5.测试OpenMP程序
总结
最近的学习上需要使用llvm编译器后端和clang编译器前端,主要是进行多线程openmp程序的开发与学习,踩了不少坑,随之记录下来以供大参考
广义上LLVM指包括前端优化器后端在内的架构编译器的框架系统,狭义的LLVM指优化器和后端部分,而前端可以跟GCC和Clang等配合使用。LLVM将前端,优化器和后端三者解耦,通过生成相同的中间表示IR来兼容不同的高级语言与不用的机器底层架构广义上LLVM指包括前端优化器后端在内的架构编译器的框架系统,狭义的LLVM指优化器和后端部分,而前端可以跟GCC和Clang等配合使用。LLVM将前端,优化器和后端三者解耦,通过生成相同的中间表示IR来兼容不同的高级语言与不用的机器底层架构。
在初次下载llvm源码后对其进行编译产生了版本需求错误,因此需要先更新CMake版本
下载源码-解压-编译-安装
cd /usr/local/src
//下载源码
wget https://cmake.org/files/v3.6/cmake-3.6.2.tar.gz
//解压
tar -zxvf cmake-3.6.2.tar.gz
./bootstrap
//编译
gmake
//安装
gmake install
//删除旧版本(无需确认)
yum remove cmake -y
//建立软连接
ln -s /usr/local/bin/cmake /usr/bin/
//查看版本
cmake --version
//成功显示如下代码
cmake version 3.6.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).
因为安装llvm对gcc版本有要求,否则在源码的编译阶段就会校验无法通过,报下面的错误
Host GCC version should be at least 5.1 because LLVM will soon use new C++
features which your toolchain version doesn't support. Your version is
4.8.5. You can temporarily opt out using
LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN, but very soon your toolchain won't be
supported.
下载源码 解压 编译安装
//进入目录(个人喜好配置)
cd /usr/local/src
//下载源码
wget http://ftp.gnu.org/gnu/gcc/gcc-7.1.0/gcc-7.1.0.tar.bz2
//解压
tar -jxvf gcc-7.1.0.tar.bz2
//进入解压后文件夹
cd gcc-7.1.0
//下载Gcc相关的依赖库 显示多个文件ok为成功(仅可在当前目录执行)
./contrib/download_prerequisites
// 建立编译输出目录
mkdir gcc-temp
./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
// 编译
make
// 安装
make install
//查看版本
gcc-v
//成功显示如下代码
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/7.1.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
Thread model: posix
gcc version 7.1.0 (GCC)
至此安装完成
安装位置:/usr/local/bin/
可以在Linux上下载也可以在宿主机上进行下载使用Xftp进行传输,本案例使用Xftp下载
进入官网Download LLVM releases选择任意需要的版本即可
主要下载LLVM源码,下载Clang源码以及额外工具源码和openmp项目源码四项
下载完成后使用xftp传输到虚拟机上,一般存放在usr/local/src下自行管理文件源码
传输完成后因为都是tar.xz结尾的文件,需要使用 tar xvJf xxx.tar.xz进行解压生产对于的文件夹
tar xvJf llvm-9.0.0.src.tar.xz
tar xvJf cfe-9.0.0.src.tar.xz
tar xvJf clang-tools-extra-9.0.0.src.tar.xz
根据llvm介绍进行文件组织以便于一次性编译
linux端代码如下:
mv cfe-9.0.0.src clang
mv clang/ llvm-9.0.0.src/tools/
mv clang-tools-extra--9.0.0.src extra
mv extra/ llvm-9.0.0.src/tools/clang/
mv compiler-rt-9.0.0.src compiler-rt
mv compiler-rt llvm-9.0.0.src/projects/
下一步就是在解压后的源码文件夹同级目录构建build文件夹,进行编译安装(防止污染源代码)
mkdir build-llvm-9.0.0
cd build-llvm-9.0.0
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr/local/llvm -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=On ../llvm-9.0.0.src/
//编译 极为耗时大约5h
make
//安装
make install
如果再次如下出现 gcc版本校验不通过问题
Host GCC version should be at least 5.1 because LLVM will soon use new C++
features which your toolchain version doesn't support. Your version is
4.8.5. You can temporarily opt out using
LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN, but very soon your toolchain won't be
supported.
需要在构建makefiles时使用cmake参数来指定编译器
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr/local/llvm -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=On -DCMAKE_CXX_COMPILER=/usr/local/bin/c++ -DCMAKE_C_COMPILER=/usr/local/bin/gcc ../llvm-9.0.0.src/
//编译 极为耗时大约5h
make
//安装
make install
之后可以查看clang和llvm的版本
clang --version
//显示如下
clang version 9.0.0 (tags/RELEASE_900/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin
llvm-as --version
//显示如下
LLVM (http://llvm.org/):
LLVM version 9.0.0
Optimized build with assertions.
Default target: x86_64-unknown-linux-gnu
Host CPU: (unknown)
可以进行简单的.c文件和.cpp文件编译执
如果clang编译时报错:找不到头文件omp需要安装配置OpenMP库
在第一次下载LLVM相关源码的时候下载了openmp项目的源码:openmp-9.0.0.src.tar.xz
tar xvJf openmp-9.0.0.src.tar.xz
//生产对应文件
//在openmp-9.0.0.src文件夹同级创建build文件夹用来编译执行
mkdir build-openmp-9.0.0
cd build-openmp-9.0.0
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/usr/local/llvmopenmp -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=On -DCMAKE_CXX_COMPILER=/usr/local/bin/c++ -DCMAKE_C_COMPILER=/usr/local/bin/gcc ../openmp-9.0.0.src
//编译
make
//安装
make install
//成功显示
Install the project...
-- Install configuration: "Release"
-- Installing: /usr/local/llvmopenmp/lib/libomp.so
-- Installing: /usr/local/llvmopenmp/include/omp.h
-- Installing: /usr/local/llvmopenmp/include/omp-tools.h
-- Installing: /usr/local/llvmopenmp/include/ompt.h
-- Installing: /usr/local/llvmopenmp/lib/libomptarget.so
不再提示找不到头文件omp.h
报错:/usr/bin/ld: cannot find -lomp
clang-9: error: linker command failed with exit code 1 (use -v to see invocation)
方法一:
修改环境变量
//这里的路径是安装openmp时在cmake个人指定的路径
export LD_PATH=/usr/local/llvmopenmp/lib:$LD_PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: /usr/local/llvmopenmp/lib/
方法二:
复制头文件到下面文件夹
/usr/local/include
/usr/local/lib/clang/9.0.0/include
/usr/include
使用终端指令或者xftp
方法三:
可以在提示的usr/bin中添加软连接
//第一个参数路径为源so文件所在位置,根据个人安装路径决定
//第二个参数为复制过来的文件名(使用原名libomp.so)
ln -s /usr/local/llvmopenmp/lib/libomp.so libomp.so
成功执行
执行过程为如下:
//编译
clang++ -fopenmp -o fibonacci_task fibonacci_task.cpp
//执行
./fibonacci_task
//结果为
fib(16)=987
本文参考链接如下:
https://yunan.blog.csdn.net/article/details/86378589
https://blog.csdn.net/weixin_41492299/article/details/89552995
从初学Linux到cmake到gcc到llvm到clang总计用时两天,编译安装完后的build文件可以删除,不影响编译器的使用,当发现其他问题会及时补充。
初次使用虚拟机,对centos也是初学,有很多不到位的地方还希望各位指出,积极修改