想通过apt快速安装gcc6.3.0无果,只好通过源码编译安装。
我参考了这篇文章:https://www.huaweicloud.com/articles/5d288251868d742738e7a9c97e9d3139.html
里面很详细,包括给出了安装过程中可能出现的问题的解决方案。先分别安装gmp、mpfr、mpc、isl,然后再编译安装gcc-6.3.0
(1)安装gmp
下载地址:https://gmplib.org/
- $cd gmp-6.1.2/
- $ mkdir build
- $ cd build/
- $ ../configure --prefix=/usr/local/gmp-6.1.2
- $ make -j12
- $ sudo make install
(2)安装mpfr
下载地址:https://www.mpfr.org/
- $cd mpfr-4.0.2/
- $ mkdir build
- $ cd build/
- $ ../configure --prefix=/usr/local/mpfr-4.0.2 --with-gmp=/usr/local/gmp-6.1.2
- $ make -j12
- $ sudo make install
(3)安装mpc
下载地址:http://www.multiprecision.org/mpc/
- $ cd mpc-1.1.0/
- $ mkdir build
- $ cd build/
- $ ../configure --prefix=/usr/local/mpc-1.1.0 --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-4.0.2
- $ make -j12
- $ sudo make install
(4)安装isl
下载地址:http://isl.gforge.inria.fr/
- $ cd isl-0.18/
- $ mkdir build
- $ cd build/
- $ ../configure --prefix=/usr/local/isl-0.18 --with-gmp=/usr/local/gmp-6.1.2
- $ make -j12
- $ sudo make install
[问题一]:
在安装gmp之后,在安装isl时出现了cannot find gmp.h错误,但是查看相应的路径/usr/local/gmp-6.1.2/include/gmp.h,明明是已经存在的。
[解决方法]:
执行了下列命令就好了,但是不知道为什么。
$ sudo apt install libgmp-dev
(5)安装gcc-6.3
下载地址:https://ftp.gnu.org/gnu/gcc/gcc-6.3.0/
安装前先编辑好环境变量:
- $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-1.1.0/lib:/usr/local/gmp-6.1.2/lib:/usr/local/mpfr-4.0.2/lib:/usr/local/isl-0.18/lib:/usr/local/lib:/usr/lis/x86_64-linux-gnu
然后再安装:
- $ 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.1.2 --with-mpfr=/usr/local/mpfr-4.0.2 --with-mpc=/usr/local/mpc-1.1.0 --with-isl=/usr/local/isl-0.18
- $ make -j12
- $ sudo make install
[问题二]:
make的过程中,出现了如下错误:
error: dereferencing pointer to incomplete type 'struct ucontext'
sc = (struct sigcontext *)(void *) &uc_->uc_mcontext);
[解决方法]:
找到出错的源代码,把 struct ucontext * uc_ = context->cfa 改成 struct ucontext_t * uc_ = context->cfa 再make就可以了。
[问题三] :
同样是make过程中报的错
aggregate ‘sigaltstack handler_stack’ has incomplete type and cannot be defined
struct sigaltstack handler_stack;
这是由于libsanitier跟最新的glibc冲突了。
[解决方法] :
https://reviews.llvm.org/D35246
照着上面的网站把
*libsanitizer/sanitizer_common/sanitizer_linux.h
*libsanitizer/sanitizer_common/sanitizer_linux.cc
*libsanitizer/sanitizer_common/sanitizer_stoptheworld_linux_libcdep.cc
*libsanitizer/tsan/tsan_platform_linux.cc
四个文件源代码改了就好了。
(6)
安装好之后,把切换gcc版本,如果之前就已经安装了别的gcc版本
sudo update-alternatives --install /usr/local/gcc-6.3.0/bin/gcc gcc /usr/bin/gcc 100
sudo update-alternatives --install /usr/local/gcc-6.3.0/bin/g++ g++ /usr/bin/g++ 100
(sudo update-alternatives --install 源文件 文件名 目的路径及文件名 优先级)
sudo update-alternatives --config gcc
(7)
使用gcc6.3.0来编译c语言代码,发现gcc找不到libisl.so.15这个库,可以参考这两个网址:
http://www.cxyzjd.com/article/qq_22633333/110949928
https://blog.csdn.net/u012329294/article/details/88770184
因此,将/usr/local/ils-0.18/lib/libisl.so.15生成一个软连接到编译器默认库的路径下即可:
sudo ln -s /usr/local/ils-0.18/lib/libisl.so.15 /usr/lib/libisl.so.15
(从原文中复制了安装过程是担心原链接失效,但没有看到作者是否允许转载,现在选择转载发布,若冒犯到原作者,请私信我删除博客,真的没有恶意。)