LLVM+Clang+centos编译第一个openmp程序


前言

一、LLVM是什么?

二、使用步骤

1.升级CMake

2.升级GCC

3.下载LLVMClang相关源码

4.安装OpenMP库并链接

5.测试OpenMP程序

总结



前言

最近的学习上需要使用llvm编译器后端和clang编译器前端,主要是进行多线程openmp程序的开发与学习,踩了不少坑,随之记录下来以供大参考



一、LLVM是什么?

广义上LLVM指包括前端优化器后端在内的架构编译器的框架系统,狭义的LLVM指优化器和后端部分,而前端可以跟GCC和Clang等配合使用。LLVM将前端,优化器和后端三者解耦,通过生成相同的中间表示IR来兼容不同的高级语言与不用的机器底层架构广义上LLVM指包括前端优化器后端在内的架构编译器的框架系统,狭义的LLVM指优化器和后端部分,而前端可以跟GCC和Clang等配合使用。LLVM将前端,优化器和后端三者解耦,通过生成相同的中间表示IR来兼容不同的高级语言与不用的机器底层架构。

LLVM+Clang+centos编译第一个openmp程序_第1张图片


二、使用步骤


1.升级CMake

在初次下载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).

2.升级GCC

因为安装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/

3.下载LLVMClang相关源码

可以在Linux上下载也可以在宿主机上进行下载使用Xftp进行传输,本案例使用Xftp下载

进入官网Download LLVM releases选择任意需要的版本即可

LLVM+Clang+centos编译第一个openmp程序_第2张图片

主要下载LLVM源码,下载Clang源码以及额外工具源码和openmp项目源码四项

LLVM+Clang+centos编译第一个openmp程序_第3张图片

 下载完成后使用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+Clang+centos编译第一个openmp程序_第4张图片

根据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库

4.安装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

LLVM+Clang+centos编译第一个openmp程序_第5张图片

使用终端指令或者xftp 

方法三:

可以在提示的usr/bin中添加软连接 

//第一个参数路径为源so文件所在位置,根据个人安装路径决定
//第二个参数为复制过来的文件名(使用原名libomp.so)
ln -s /usr/local/llvmopenmp/lib/libomp.so  libomp.so

成功执行

5.测试OpenMP程序

LLVM+Clang+centos编译第一个openmp程序_第6张图片

 执行过程为如下:

//编译
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也是初学,有很多不到位的地方还希望各位指出,积极修改

你可能感兴趣的:(OpenMP,centos,llvm,linux,clang,openmp)