因为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的.因此安装的数据库的版本和本文略微有些不同,但是对错误的解决方式除了导入环境变量几乎没有提.