Linux平台下源码编译GCC

目标及说明

尽量完整编译整个GCC组件,适用于GCC 4以后的版本。liboffload目前还没成功编译。这里的“完整编译”,是指在configure阶段,–enable-languages=all。GCC包括了gcc(C编译器),g++(C++编译器),gfortran(Fortran编译器),gnat(Ada编译器),gdc(d编译器)等,还有go,objc等其他编译器。

区别于各个Linux发行版将自带的软件放在/usr下,这里我假设所有自行编译的软件在$HOME/usr下。实际上,管理员通常将自行编译的软件放在/usr/local下;对于普通用户而言,由于没有/usr/local的权限,只能将软件放在用户路径下。

此方法亦适用于虚拟机中的Linux和WSL。笔者已经在CentOS 7,Ubuntu 20.04,Ubuntu 22.04,WSL2 Ubuntu 22.04中成功编译GCC 12.2.0。

根据以往的经验,似乎每年4、5月份GCC都会有一次大版本更新。

准备工作

源码编译,需要用Linux平台已有的工具(包括GCC和make)去编译。因此,需要事先在这些Linux发行版上下载安装。以Ubuntu 22.04为例,在终端运行

sudo apt-get install gcc g++ gfortran make vim

添加环境变量

终端输入

vim ~/.bashrc

在文件末尾添加

export PATH=$HOME/usr/bin:$HOME/usr/sbin:$PATH
export LD_LIBRARY_PATH=$HOME/usr/lib64:$HOME/usr/lib:/usr/local/lib64:/usr/local/lib:/usr/local/lib32:/usr/local/libx64:/usr/local/libx32:/usr/lib64:/usr/lib:/usr/lib32:/usr/libx64:/usr/libx32:/lib64:/lib
export C_INCLUDE_PATH=$HOME/usr/include:/usr/local/include:/usr/include:/include

如果不考虑将编译内容移植到其他平台,笔者建议额外添加如下内容,可以针对本机做出一定优化。

export CFLAGS="-march=native"
export CXXFLAGS="-march=native"
export FFLAGS="-march=native"

安装额外内容

终端输入以下内容,检查gcc的版本。

gcc --version

输出版本(在Ubuntu 22.04上)通常是11.3.0。于是在终端输入

sudo apt-get install gnat-11 gdc-11
sudo cp /usr/bin/gnat-11 /usr/bin/gnat
sudo cp /usr/bin/gdc-11 /usr/bin/gdc

GCC若是其他版本,以此类推。需要强调,运行以下命令不一定能得到版本为11的gnat或gdc。

sudo apt-get install gnat gdc # 不要运行此命令

安装依赖项

包括m4,autoconf,automake,gmp,mpfr,mpc,isl,cloog。除了最后两个,其余都能在GNU网站下载,有条件可以去Github找找最后两个的源码。以下省略下载途径,并假设源码文件已经解压,直接在源码目录(在configure文件所在目录)打开终端。

M4 autoconf automake GMP

按照标题给出的顺序依次运行以下内容。

bash ./configure --prefix=$HOME/usr
make
make install

MPFR

bash ./configure --prefix=$HOME/usr --with-gmp=$HOME/usr
make
make install

MPC

bash ./configure --prefix=$HOME/usr --with-gmp=$HOME/usr --with-mpfr=$HOME/usr
make
make install

isl

bash ./configure --prefix=$HOME/usr --with-gmp-prefix=$HOME/usr
make
make install

cloog

bash ./configure --prefix=$HOME/usr --with-gmp-prefix=$HOME/usr --with-isl-prefix=$HOME/usr
make
make install

源码编译GCC

注意,GCC的编译不能在源码目录进行。

cd gcc-src/..
mkdir gcc-build && cd gcc-build
bash ../gcc-src/configure --prefix=$HOME/usr --with-gmp=$HOME/usr --with-mpfr=$HOME/usr --with-mpc=$HOME/usr --with-isl=$HOME/usr --with-isl-lib=$HOME/usr/lib --with-cloog=$HOME/usr --enable-languages=all --disable-multilib

可以在输出中找到

The following languages will be built: c,ada,c++,d,fortran,go,lto,objc,obj-c++
*** This configuration is not supported in the following subdirectories:
     target-liboffloadmic
    (Any other directories should still work fine.)

如果没有ada或者d,那很有可能是前面gnat和gdc安装步骤有问题。

如果需要编译JIT的话,在configure选项添加–enable-host-shared。不过JIT的编译会导致GCC的运行变慢,故而笔者并没有添加此选项。

make
make install

编译速度很慢,通常需要几个小时。如果硬件条件允许的话(特别注意内存),看下CPU是多少线程,假设N线程,

make -jN
make install

可能出现的问题

GCC的configure过程中显示不会编译ada或d

gnat或gdc没有安装,或者gnat或gdc的版本与系统自带的gcc、g++版本不同。

GCC的make过程中显示一个与__float128相关的error

环境变量PATH,LD_LIBRARY_PATH,C_INCLUDE_PATH中含有intel的库,产生了干扰。这时候干脆先在终端运行

export PATH=$HOME/usr/bin:$HOME/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin

LD_LIBRARY_PATH和C_INCLUDE_PATH同理。再继续GCC的configure。

GCC的make过程中提示没有找到libisl.so

尽管我们已经编译安装了isl,但有的时候提示没有。故而在GCC的configure选项中加入–with-isl-lib=$HOME/usr/lib。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值