Ubuntu18.04下磕磕磕绊绊绊编译安装GCC6.3的过程

  • Post author:
  • Post category:其他


因为Ubuntu下面的MATLAB非要用GCC6.3,而且在安装过程中遇到了比之前遇到的任何问题都要多的问题,所以特地开一个帖子来记录下安装过程



环境要求

安装GCC之前有几个库是一定需要的,GMP,mpfr,MPC,isl。至于要不要卸载旧版本的GCC目前尚且不太清楚。在安装GCC时我的系统里安装的GCC的版本是7.4.在安装这些库的过程中有顺序要求,比较好的就是按照GMP,mpfr,MPC,isl的



安装GMP

在GMP的

官网

下载GMP的最新的安装包,然后解压到自己的电脑上。

$ cd gmp-6.2.0/
$ mkdir build
$ cd build/
$ ../configure -prefix=/usr/local/gmp-6.2.0
$ make -j12
$ sudo make install

说明一下,在这段代码中的

-prefix

参数是用于指定GMP的安装目录,例如这里指定的目录是/usr/local/gmp-6.2.0,那么GMP就会被安装在这个目录之下。这里推荐在之前的解压步骤也是把

gmp-6.2.0

这个文件夹放在/use/local目录之下。

make 后面的

-j12

参数用于调用多线程加速编译。

在安装完之后最好用

make check

来测试下自己的安装是否成功,后面的三个库的安装同样需要测试,就不再重复



安装mpfr

同样也是到它的

官网

下载最新的包,安装过程和GMP的安装类似,执行下面的命令即可。

$ cd mpfr-4.0.2/
$ mkdir build
$ cd build/
$ ../configure --prefix=/usr/local/mpfr-4.0.1 --with-gmp=/usr/local/gmp-6.2.0
$ make -j12
$ sudo make install


with

参数用于指定GMP库的位置。因为要用到之前安装的GMP所以GMP的安装需要放在mpfr之前



安装MPC


官网

$ cd mpc-1.1.0/
$ mkdir build
$ cd build/
$ ../configure -prefix=/usr/local/mpc-1.1.0 -with-gmp=/usr/local/gmp-6.2.0 -with-mpfr=/usr/local/mpfr-4.0.2
$ make -j12
$ sudo make install



安装isl

这一步我看到很多博主说不是必须的,因为用到了isl的一个文件,而且在后面的配置过程中程序会检查当前计算机是否安装有isl0.15或者isl0.16.因此建议还是在这个地方把isl装上.

$ cd isl-0.15/
$ mkdir build
$ cd build/
$ ../configure --prefix=/usr/local/isl-0.15 --with-gmp=/usr/local/gmp-6.2.0
$ make -j12
$ sudo make install

这个地方的isl我没有安装最新的版的0.22或者其他博主一样的0.18,而是选择了版本更老的isl-0.15.考虑到程序会检查这步,所以就选择了0.15版本

这里再顺带提一句,isl的安装和上面三个库的安装

略有不同

, 对解压位置和安装位置有一定的要求,如果和上面的库一样的安装和解压位置的话(指解压和安装的位置都在/usr/local下面),那么很大概率程序会报


configure:error:Installation in source dirctory not supported


的错.这个时候就要求我们的

安装位置

和解压压缩包的

解压位置

需要区分开来.就比如说压缩包解压出来的文件夹放在

/home/username

文件夹下面,安装位置还是

/usr/local

下面



安装GCC

这是最最最最难的一步,我觉得.在这个过程中碰到了很多奇奇怪怪的问题.下面尽可能的列举一下

在make我们的GCC之前首先需要将上面安装的库文件添加到环境变量中去.

gedit ~/.bashrc

在bashrc的最后添加上这样的指令

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-1.1.0/lib:/usr/local/gmp-6.2.0/lib:/usr/local/mpfr-4.0.2/lib:/usr/local/isl-0.15/lib:/usr/local/lib:/usr/lib/x86_64-linux-gnu

如果没有正确的添加环境变量可能会产生

checking for suffix of object files... configure: error: in '/home/manu/gcc/gcc/i686-pc-linux-gnu/libgcc':
configure: error: cannot compute suffix of object files: cannot compile
See 'config.log' for more details.

这样的错误.我们也可以打开对应文件夹下面的

config.log

文件来查看到底是哪里出现了问题

然后执行下面的命令来编译和安装GCC

$ cd gcc-6.3.0/
$ mkdir build
$ cd build/
$ ../configure --prefix=/usr/local/gcc-6.3 --disable-multilib --with-system-zlib --enable-languages=c,c++ --with-gmp=/usr/local/gmp-6.2.0 --with-mpfr=/usr/local/mpfr-4.0.2 --with-mpc=/usr/local/mpc-1.1.0 --with-isl=/usr/local/isl-0.15
$ make -j12
$ sudo make install



错误一

In file included from …/…/…/gcc-6.3.0/libgcc/unwind-dw2.c:401:0:
./md-unwind-support.h: 在函数‘x86_64_fallback_frame_state’中:
./md-unwind-support.h:65:47: 错误: dereferencing pointer to incomplete type ‘struct ucontext’
sc = (struct sigcontext *) (void *) &uc_->uc_mcontext;

解决方法:



/usr/local/gcc-6.3.0/build/x86_64-pc-linux-gnu/libgcc

下找到文件

md-unwind-support.h

,将

第61行



struct ucontext *uc_ = context->cfa;

,修改为

struct ucontext_t *uc_ = context->cfa;



错误二

…/…/…/…/gcc-6.3.0/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc: 在函数‘int __sanitizer::TracerThread(void*)’中:
…/…/…/…/gcc-6.3.0/libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc:270:22: 错误: 聚合‘sigaltstack handler_stack’类型不完全,无法被定义
struct sigaltstack handler_stack;

或者是

aggregate ‘sigaltstack handler_stack’ has incomplete type and cannot be defined
   struct sigaltstack handler_stack;

意思都是一个意思,这里可以借鉴

Fix sanitizer build against latest glibc

这个网址的方法,在这个网址的最后有修改前后的对比图,详细的展示了如何修改.

解决完这样两个大问题之后编译就可以正常通过了,虽然最后写起来似乎编译也就这么回事,问题也不是很困难,找到修改的地方修改就行了.但是不断的在搜索引擎上查找资料的过程却是最漫长的.

再提一点建议,善用搜索引擎,多多查看config.log.多往上翻翻究竟什么地方出错了.因为即使错误类型不一样在编译出错的最下面的报错方式却几乎大同小异.



创建软链接

$ cd /usr/bin
$ sudo ln -s /usr/local/gcc-6.3/bin/gcc gcc
$ sudo ln -s /usr/local/gcc-6.3/bin/g++ g++

如果这个时候提示文件已存在并且无法创建文件链接的话,说明我们需要删除已经存在的软链接,再执行这个命令创建新的软链接

这里解读一下ln命令,ln -s后面的第一个参数是

被链接的目标的绝对路径

,也就是gcc的在操作系统下的绝对路径,第二个参数是对链接目标创建的符号路径



最终成果

在这里插入图片描述



参考文章

  • 针对报错

    aggregate ‘sigaltstack handler_stack’ has incomplete type and cannot be defined

    的另一种解决方式,虽然因为没看懂怎么操作的没有采用:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81066
  • 一个小坑:https://blog.csdn.net/Xin_101/article/details/89356935,这篇文章中也提到了上述两个问题的解决方式,但是第二个问题他提供的解决方式似乎并不能完全的解决问题,而且会出现

    stack_t不是一个类型名,未声明

    的新报错.当时在这个地方卡了很久,引以为戒
  • .主要参考文章: https://blog.csdn.net/yrc19950911/article/details/86184269.这篇文章是在Ubuntu16.04环境下编译和安装6.3.0的.因此安装的数据库的版本和本文略微有些不同,但是对错误的解决方式除了导入环境变量几乎没有提.



版权声明:本文为qq_34906039原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。