信创系统麒麟V10下的GCC/G++/Clang/Clang++编译器升级

    本文记录了在麒麟V10系统下,编译安装高版本的GCC/G++编译器(GCC 10、GCC 13)和LLVM Clang编译器的方法,对系统没有影响,不需要root权限,可随时切换自己编译的高版本GCC、Clang和系统默认环境。

1.背景

    麒麟V10系统自带的GCC/G++编译器版本是7.3.0,这个编译器支持了C++17标准,基本上已经够用了,但是有些比较新的软件,可能需要高版本的GCC/G++才能编译。因此需要升级编译器版本,但是我又不敢直接替换系统编译器,否则谁知道系统会出啥幺蛾子,因此就要用非入侵的方法升级。
    由于自带的GCC 7版本老,想一步到GCC 13估计有点难,只能一步一步的自举了。正常来说,自举应该是7->8->9->10->11->12->13的顺序,但是要知道,编译GCC可是大工程,没那么多时间折腾,因此我偷了个懒,7->10->13,自举两次成功了。先用系统自带的GCC 7编译出GCC 10,再用GCC 10编译出GCC 13。

$ gcc -v
使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-linux-gnu/7.3.0/lto-wrapper
目标:x86_64-linux-gnu
配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,fortran,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-7.3.0/obj-x86_64-linux-gnu/isl-install --without-cloog --enable-gnu-indirect-function --build=x86_64-linux-gnu --with-stage1-ldflags=' -Wl,-z,relro,-z,now' --with-boot-ldflags=' -Wl,-z,relro,-z,now' --with-tune=generic --with-arch_32=x86-64 --disable-multilib
线程模型:posix
gcc 版本 7.3.0 (GCC) 


2.下载源码

    从 https://ftp.gnu.org/gnu/gcc/ 网站上可以下载需要的GCC源码,这里我下载了 gcc-10.5.0.tar.xz 和 gcc-13.3.0.tar.xz 文件。之后解压源码包,源码包里有个下载依赖库的脚本,要先执行下载依赖的脚本,下载完成后,才能开始编译。下载的内容不多,网络通常的话,很快。

$ tar -xvJf gcc-10.5.0.tar.xz
$ cd gcc-10.5.0
$ ./contrib/download_prerequisites  #这里就是支持下载依赖的脚本。留意日志,如果失败了,要重试

3.编译

    首先,确保系统的GCC 7可以正常编译程序,然后,再确认上面的步骤里,下载依赖库都成功了,编译GCC就很容易了。
    注意一点,由于不替换系统编译器,所以,我们在配置的时候,要把GCC的安装目录,修改到自己的用户目录$HOME/opt/gcc-10下,之后的GCC就放在这里了。

$ cd gcc-10.5.0
$ mkdir build && cd build
$ ../configure --prefix=$HOME/opt/gcc-10 --enable-languages=c,c++,fortran,go --disable-multilib
$ make    #亲测,这里最好就一个线程编译。如果加了-j参数指定多线程编译,经常出问题,稳妥起见,单线程吧,就是等的久一点。
$ make install

4.使用编译器

   现在GCC 10已经编译出来,并存放在$HOME/opt/gcc-10目录下,但是还不能直接使用,需要设置环境。在$HOME/opt/gcc-10目录下新建enable文件,并给予可执行权限,写入以下内容:

#这个是GCC目录存放的路径,要根据自己的存放路径情况进行修改!!! 
export MAIN_PATH=$HOME/opt/gcc-10

export PATH=${MAIN_PATH}/bin${PATH:+:${PATH}}
export MANPATH=${MAIN_PATH}/share/man:${MANPATH}
export INFOPATH=${MAIN_PATH}/share/info${INFOPATH:+:${INFOPATH}}
export PCP_DIR=${MAIN_PATH}

export LD_LIBRARY_PATH=${MAIN_PATH}/lib64:{LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export PKG_CONFIG_PATH=${MAIN_PATH}/lib64/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}

   这样,即可通过$HOME/opt/gcc-10/enable文件,来激活环境。打开一个终端,默认都是系统的环境,只要执行一下"source $HOME/opt/gcc-10/enable"这个命令,当前终端里的编译环境,就换成了gcc 10。当然,这个修改只对当前打开的这个终端有效,新打开的终端,仍然是系统默认环境。
   如果嫌弃每次打开终端,都要enable一次才能用gcc 10,也可以把"source $HOME/opt/gcc-10/enable"写到~/.bashrc里,启动终端自动执行。

$ source $HOME/opt/gcc-10/enable    #激活GCC 10环境
$ gcc -v
使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/home/xxxxx/opt/gcc-10/libexec/gcc/x86_64-pc-linux-gnu/10.5.0/lto-wrapper
目标:x86_64-pc-linux-gnu
配置为:../configure --prefix=/home/xxxxx/opt/gcc-10 --enable-languages=c,c++,fortran,go --disable-multilib
线程模型:posix
Supported LTO compression algorithms: zlib
gcc 版本 10.5.0 (GCC) 

5.继续自举

    有了GCC 10以后,就可以用GCC 10来编译GCC 13了,步骤方法完全一样,即回到上面的第二步,一步一步来,编译出gcc 13。

$ source $HOME/opt/gcc-13/enable    #激活GCC 13环境
$ gcc -v
使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/home/xxxxx/opt/gcc-13/libexec/gcc/x86_64-pc-linux-gnu/13.3.0/lto-wrapper
目标:x86_64-pc-linux-gnu
配置为:../configure --prefix=/home/xxxxx/opt/gcc-13 --enable-languages=c,c++,fortran,go --disable-multilib
线程模型:posix
支持的 LTO 压缩算法:zlib
gcc 版本 13.3.0 (GCC) 

6.编译结果下载

    这里我可以把编译出来的编译器成果共享一下,我的系统下都是正常的,但是不保证你的系统能用,大概率没问题。
    不过,要注意,解压出文件以后,一定要按照自己电脑上的路径,修改enable文件里的MAIN_PATH路径
  链接:https://pan.baidu.com/s/1leYlzzpAP68LsMthj4dr3g 
  提取码:71dj

7.Clang编译器的编译

    原本高版本的GCC有了,正常软件都可以编译了,但奈何有些需要用到LLVM,于是不得已,还要编译LLVM,编译Clang出来。我需要的LLVM版本不需要太高,版本10就行,用系统自带的Gcc 7.3就能编译出来。
   首先,先下载llvm的源代码:https://github.com/llvm/llvm-project ,但是由于源码量巨大,将近3个G,下载总是失败,我换了清华的镜像下载:

# 从清华的镜像下载源码,使用10.0.1的版本tag
git clone https://mirrors.tuna.tsinghua.edu.cn/git/llvm-project.git --recursive --branch llvmorg-10.0.1

由于不替换系统编译器,所以,我们在配置的时候,要把LLVM的安装目录,修改到自己的用户目录$HOME/opt/llvm-10下,之后的LLVM和Clang就放在这里了。

cd llvm-project
mkdir build && cd build
cmake ../llvm  -DLLVM_ENABLE_PROJECTS=clang -DCMAKE_BUILD_TYPE=Release  -DCMAKE_INSTALL_PREFIX="$HOME/opt/llvm-10"
make	#漫长的编译过程,非常漫长
make install

     编译安装完成以后,LLVM存放在$HOME/opt/llvm-10目录下,但是还不能直接使用,需要设置环境。跟GCC一样,在$HOME/opt/llvm-10目录下新建enable文件,并给予可执行权限,写入以下内容:

#source $HOME/opt/llvm-10/enable 
# 这里是LLVM的存放路径,要根据自己的实际情况修改。
export LLVM_INSTALL_DIR=$HOME/opt/llvm-10

# General environment variables
export PATH=${LLVM_INSTALL_DIR}/bin${PATH:+:${PATH}}
export MANPATH=${LLVM_INSTALL_DIR}/share/man:${MANPATH}

export LD_LIBRARY_PATH=${LLVM_INSTALL_DIR}/lib:{LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

接下来,用法就跟GCC一样了。

$ source $HOME/opt/llvm-10/enable 	#激活LLVM环境
$ clang -v
clang version 10.0.1 
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/xxxxx/opt/llvm-10/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.3.0
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.3.0
Candidate multilib: .;@m64
Selected multilib: .;@m64

$ clang++ -v
clang version 10.0.1 
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/xxxxx/opt/llvm-10/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.3.0
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.3.0
Candidate multilib: .;@m64
Selected multilib: .;@m64

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值