信创系统麒麟V10下的GCC/G++/Clang/Clang++编译器升级
zzzzllll2006 2024-10-03 12:07:02 阅读 97
本文记录了在麒麟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 文件。之后解压源码包,源码包里有个下载依赖库的脚本,要先执行下载依赖的脚本,下载完成后,才能开始编译。下载的内容不多,网络通常的话,很快。
<code>$ 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"code>
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
上一篇: Parallels Desktop安装并配置Ubuntu
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。