Ubuntu16.04系统中GCC9.1编译器安装⽅法及C++17标准测试⽰例
严正声明:本⽂系作者davidhopper原创,未经许可,不得转载。
2019年8⽉2⽇更新:
本⽂⽅法适⽤于GCC 9.1.0,只需将原⽂中的GCC 7.3.0替换为GCC 9.1.0即可。
为什么要更新到GCC 9.1.0?因为该版本可⽀持C++ 17标准的并⾏策略。
如何使⽤C++17标准的并⾏策略,参考我的另⼀篇博客:《》。
2017年底,C++17标准正式颁布,该标准的最⼤贡献是,提供了STL库算法的并⾏运算版本,对于我这种喜欢追求算法性能的程序员⽽⾔,⽆疑是⼀个极⼤的福⾳。幸运地是,Linux系统标准编译器GCC能完美地⽀持C++ 17标准,但需升级到7.0以上版本;不幸地
是,Ubuntu 16.04版本⾃带的GCC版本为5.4.0,可⽀持C++ 14标准,但基本不⽀持C++ 17标准。怎么办?那就从零开始,从GCC官⽅⽹站下载、安装最新标准的编译器吧。
⼀、下载GCC 7.3.0版本源代码
⼆、编译安装GCC 7.3.0
2.1 解压源代码压缩包
从镜像服务器下载GCC 7.3.0版源代码压缩包“gcc-7.3.”后,⾸先将其放置于⼀个合适的⽬录,进⾏解压(我将“gcc-
7.3.”放置于⽬录“/home/davidhopper/code/gcc”中),命令如下:
cd ~/code/gcc
tar zxvf gcc-7.3.
结果就是所有源代码⽂件全部解压到了⽬录“/home/davidhopper/code/gcc/gcc-7.3.0”中。
2.2 建⽴构建⽂件夹
由于GCC官⽹的安装⽂档强烈建议不要在源代码⽂件中进⾏编译,⽽需另外建⽴⼀个构建⽂件夹(原⽂为:First, we highly recommend that GCC be built into a separate directory from the sources which does not reside within the source tree. This is how we generally build GCC; building where src
dir == objdir should still work, but doesn’t get extensive testing; building where objdir is a subdirectory of srcdir is unsupported.),因此,我在“/home/davidhopper/code/gcc”⽬录中另⾏创建⼀个单独的构建⽂件夹“gcc-7.3.0-build”,整个⽬录结构如下图所⽰:
2.3 下载依赖包
此时,我以为只要进⼊构建⽂件夹,然后执⾏如下配置命令就可以⽣成Makefile了,真是“too simple, sometimes naive”,世界哪有这么美好?
cd ~/code/gcc/gcc-7.3.0-build
../gcc-7.3.0/configure
果不其然,上述命令产⽣的错误信息如下,原来是缺少⼏个依赖包:GMP 4.2+, MPFR 2.4.0+, MPC 0.8.0+,需要我们⾃⼰下载。
configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify
their locations.  Source code for these libraries can be found at
their respective hosting sites as well as at
ftp:///pub/gcc/infrastructure/.  See also
/install/prerequisites.html for additional info.  If
you obtained GMP, MPFR and/or MPC from a vendor distribution package,
make sure that you have installed both the libraries and the header
files.  They may be located in separate packages.
注意:上⾯的提⽰信息存在⼀个坑,就是现在根本不存在,你如果进⼊该⽹页去下载依赖包,恐怕是到死也完不成任务,因此必须将其替换为镜像服务器地址。例如,我选择的⽼⽑⼦服务器地址为:。
下载⽅法有两种:
第⼀种是笨办法,⽼⽼实实地进⼊镜像服务器⽹址,然后依次下载:GMP 6.1.0, MPFR 3.1.4, MPC 1.0.3压缩包(只要满⾜GMP 4.2+, MPFR 2.4.0+, MPC 0.8.0+要求即可,并不⼀定是我所写的这⼏个版本),并将其解压到“/home/davidhopper/code/gcc/gcc-
7.3.0”⽬录,同时建⽴其符号链接⽬录。也就是说,在“/home/davidhopper/code/gcc/gcc-7.3.0”⽬录中会多出三个⼦⽂件夹:gmp-6.1.0、mpfr-3.1.4、mpc-1.0.3以及其其符号链接⽬录:gmp、mpfr、mpc。解压及建⽴符号链接命令如下:
cd ~/code/gcc/gcc-7.3.0
tar zxvf gmp-6.1.
tar zxvf mpfr-3.1.
tar zxvf mpc-1.0.
ln -s  gmp-6.1.0 gmp
ln -s  mpfr-3.1.4 mpfr
ln -s  mpc-1.0.3 mpc
第⼆种是省事的办法,⾸先使⽤vi编辑器打开依赖包下载脚本⽂件:contrib/download_prerequisites
cd ~/code/gcc/gcc-7.3.0
vi contrib/download_prerequisites
将该⽂件⾥的base_url='ftp:///pub/gcc/infrastructure/'替换为:base_url='/gnu/gcc/infrastructure/',即将不存在的服务器地址替换为镜像服务器地址。接下来,执⾏如下命令⾃动下载并解压依赖包:
bash contrib/download_prerequisites
如果提⽰如下信息,则代表下载并解压成功:
2018-03-24 21:01:37 URL:/gnu/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840/2383840] -> "./gmp-6.1.0.tar.bz2" [1]
2018-03-24 21:01:46 URL:/gnu/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284/1279284] -> "./mpfr-3.1.4.tar.bz2" [1]
2018-03-24 21:01:51 URL:/gnu/gcc/infrastructure/mpc-1.0. [669925/669925] -> "./mpc-1.0." [1]
2018-03-24 21:01:58 URL:/gnu/gcc/infrastructure/isl-0.16.1.tar.bz2 [1626446/1626446] -> "./isl-0.16.1.tar.bz2" [1]
gmp-6.1.0.tar.bz2: 确定
mpfr-3.1.4.tar.bz2: 确定
mpc-1.0.: 确定
isl-0.16.1.tar.bz2: 确定
All prerequisites downloaded successfully.
如果出现如下信息,则表⽰包:gmp-6.1.0.tar.bz2没有下载成功:
2018-03-24 20:54:39 URL:gcc.parentingamerica/infrastructure/mpc-1.0. [669925/669925] -> "./mpc-1.0." [1]
2018-03-24 20:56:16 URL:gcc.parentingamerica/infrastructure/isl-0.16.1.tar.bz2 [1626446/1626446] -> "./isl-0.16.1.tar.bz2" [1]
gmp-6.1.0.tar.bz2: 失败
sha512sum: 警告:1 个校验和不匹配
error: Cannot verify integrity of possibly corrupted file gmp-6.1.0.tar.bz2
这是因为⽹络连接不正常造成的,解决⽅案是,进⼊⽬录“/home/davidhopper/code/gcc/gcc-7.3.0”,⼿动将已下载的“mpc-
1.0.”、“isl-0.16.1.tar.bz2”⽂件删除,重新执⾏bash contrib/download_prerequisites命令下载。如果仍然提⽰失败,则应使⽤vi 编辑器修改contrib/download_prerequisites
⽂件⾥的base_ur=...换为另⼀个能够正常连接并下载的镜像服务器地址。
2.4 运⾏configure命令⽣成Makefile
再次进⼊构建⽂件夹,执⾏如下配置命令⽣成Makefile:
cd ~/code/gcc/gcc-7.3.0-build
../gcc-7.3.0/configure
结果⼜出了⼀个妖蛾⼦,错误提⽰如下:
configure: error: I suspect your system does not have 32-bit
development libraries (libc and headers). If you have them,
rerun configure with --enable-multilib. If you do not have them,
and want to build a 64-bit-only compiler, rerun configure with
--disable-multilib.
也就是说,configure推断本机没有32位开发库,如果的确有就加上--enable-multilib选项,否则就使⽤--disable-multilib选项只构建64位版本。现在的机器谁还⽤32位系统,于是我⽴即重新运⾏配置程序如下:
../gcc-7.3.0/configure --disable-multilib
结果令⼈欣慰,总算在构建⽬录“/home/davidhopper/code/gcc/gcc-7.3.0-build”中⽣成了Makefile。
2.5 运⾏make命令编译构建GCC编译器
接下来的事情似乎很简单,只要运⾏make命令(需指出的是, Make程序⽀持并发处理,你的处理器有⼏个核,就可以加上-j x选项,以便加快编译速度)就可以编译构建GCC编译器了,事实证明,我⼜把问题估计简单了⼀些。
cd ~/code/gcc/gcc-7.3.0-build
make -j 8
编译了不⼀会,就出现如下错误:
checking LIBRARY_ contains current directory
configure: error:
*** LIBRARY_PATH shouldn't contain the current directory when
*** building gcc. Please change the environment variable
*** and run configure again.
于是⽴即在⽹上搜索解决⽅案,到如下类似的:
出现这个错误的原因是由于环境变量的LD_LIBRARY_PATH中出现了当前⽬录。
了好久不知道是啥原因,因为不可能把这⽬录放在环境变量啊。后来发现,
通常我们写环境变量都喜欢写:
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:foo/bar
如果⼀开始LD_LIBRARY_PATH不存在的话,这个上⾯这串环境变量开头就是冒号,
这就把当前⽂件夹包含进去了。⼀般来说我们挺需要这种效果,因为在编译的时候
可以include某些东西,但是对于编译glibc来说这个是多余的。
最简单的解决⽅法就是unset LD_LIBRARY_PATH,这能把这个环境变量直接⼲掉。
好吧,开始照⽅抓药,重新执⾏如下命令:
unset LIBRARY_PATH
../gcc-7.3.0/configure --disable-multilib
make -j 8
在我机器上⼤约等了⼀个⼩时,最后全部构建成功。
2.6 运⾏sudo make install命令安装GCC编译器
cd ~/code/gcc/gcc-7.3.0-build
sudo make install
因为我在运⾏configure命令时,没有指定安装⽬录,因此上述命令会将最新版本的GCC编译器安装到默认位置:/usr/local,也就是说,头⽂件在/usr/local/include⽬录,可执⾏⽂件在/usr/local/bin⽬录,库⽂件在/usr/local/lib⽬录。
2.7 指定本机使⽤最新版本GCC编译器
使⽤update-alternatives命令配置增加最新版本编译器,注意:gcc是编译C程序的默认程序,g++是编译C++程序的默认程序。
# update-alternatives --install <;链接> <;名称> <;路径> <;优先级>
sudo update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/gcc 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/local/bin/g++ 50
使⽤下述命令查询当前已经安装的GCC编译器版本:
# 查询本机已有GCC编译器情况
gnu编译器
sudo update-alternatives --query gcc
# 查询本机已有G++编译器情况
sudo update-alternatives --query g++
我机器上的显⽰结果为:
Name: gcc
Link: /usr/bin/gcc
Status: auto
Best: /usr/local/bin/gcc
Value: /usr/local/bin/gcc
Alternative: /usr/bin/gcc-5
Priority: 20
Alternative: /usr/local/bin/gcc
Priority: 50
Name: g++
Link: /usr/bin/g++
Status: auto
Best: /usr/local/bin/g++
Value: /usr/local/bin/g++
Alternative: /usr/bin/g++-5
Priority: 20
Alternative: /usr/local/bin/g++
Priority: 50
选择默认使⽤的GCC编译器版本:
# 交互配置GCC编译器
sudo update-alternatives --config gcc
# 交互配置G++编译器
sudo update-alternatives --config g++
在我机器上的结果如下,选择默认选项“0”即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。