Linux 环境下安装 gcc 详细过程 以及安装 glibc

1、了解一下 gcc  

  目前,GCC可以用来编译C / C++、FORTRAN、Java、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。

  在安装之前,系统必须有 cc 或者 gcc 的编译器,如果没有,就不能安装更高版本的 gcc 了,如果是这种情况,可以在网上找一个与你系统相适应的如 RPM 等二进制形式的 GCC 软件包来安装使用。

如果,没有gcc或g++或make,再Ubuntu下可以安装低版本的,步骤如下:

首先:apt-get update 更新库;

apt-get install gcc;

apt-get install g++;

apt-get install make;

即可安装。

  本文介绍的是以源代码安装 gcc 的过程,我安装的是在一个单独的目录下,以后想卸载的话,直接删除该目录就行。

2、需要下载的安装包

2.1 下载 gcc

  下载网址是http://ftp.gnu.org/gnu/gcc/,可以根据自己的需要下载哪个版本。

2.2 下载3个依赖包

  一个是GMP,一个是MPFR,一个是MPC,下载地址依次为:ftp://ftp.gnu.org/gnu/gmp/gmp-6.2.1.tar.bz2 ,http://ftp.gnu.org/gnu/mpfr/mpfr-4.1.0.tar.gz, ftp://ftp.gnu.org/gnu/mpc/mpc-1.2.1.tar.gz。

安装的顺序依次为:gmp,mpfr, mpc,最后安装gcc。我开始就直接安装gcc,在配置过程出现以下信息:

configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0+.Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify their locations. 

  提示安装gcc之前,必须安装GMP 4.2以上版本,MPFR2.3.1以上版本, MPC 0.8.0以上版本。

3、安装步骤

3.1 安装 GMP

  我这里选择的是GMP-6.2.1版本,解压gmp-6.2.1后,得到源代码目录,创建一个临时编译目录temp。

$ tar -jxvf gmp-6.2.1.tar.bz2
$ cd gmp-6.2.1
$ mkdir temp
$ cd temp

开始配置安装目录,进入temp目录后,输入以下命令:

$ ../configure --prefix=/usr/local/gmp-6.2.1

$ make

$ make install

这样gmp就安装完成了。安装mpfr和mpc过程也差不多,只是安装的时候得加入依赖项

3.2 安装 MPFR

  我这里选择的是MPFR-4.1.0版本。解压mpfr-4.1.0后,建立临时编译目录temp,进入temp目录

$ tar -zxvf mpfr-4.1.0.tar.gz 

$ cd mpfr-4.1.0

$ mkdir temp

$ cd temp

$ ../configure --prefix=/usr/local/mpfr-4.1.0 --with-gmp=/usr/local/gmp-6.2.1

$ make

$ make install

 其中--with=/usr/local/gmp-6.2.1就是依赖项, /usr/local/gmp-6.2.1是gmp的安装目录

3.3 安装 MPC

  我选择的是MPC-1.2.1版本. 解压后,建立临时编译目录temp,进入temp目录.

$ tar -zxvf mpc-1.2.1.tar.gz

$ cd mpc-1.2.1

$ mkdir temp

$ cd temp

$ ../configure --prefix=/usr/local/mpc-1.2.1 --with-gmp=/usr/local/gmp-6.2.1 --with-mpfr=/usr/local/mpfr-4.1.0

$ make

$ make install

记得后面两项的依赖项,也就是你的gmp和mpfr的安装目录

3.4 安装 gcc

  前面安装的三个,都是为安装 gcc 做准备的。解压gcc-10.2.0的安装包

$ tar zxvf gcc-10.2.0.tar.gz 或者 $ tar jxvf gcc-10.2.0.tar.bz2

$ cd gcc-10.2.0

$ ./configure --prefix=/usr/local/gcc-10.2.0 --enable-multilib --enable-threads=posix --disable-checking --enable--long-long --enable-languages=c,c++,java --with-gmp=/usr/local/gmp-6.2.1 --with-mpfr=/usr/local/mpfr-4.1.0 --with-mpc=/usr/local/mpc-1.2.1

注意 --enable-multilib 这个选项, 选择支持32bit还是only 64bit. 否则会有一下提示:

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.

记得加上后面三个依赖项,否则会出刚开始出现的错误的。

然后安装

$ make

$ make install

安装的时候等挺长时间,差不多两个小时。

【注意】

安装过程可能出现这样的错误提示:

错误提示1:

/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h:No such file or directory

解决办法:
在编译32位gcc时出现如上所示的错误,原因时没有安装32位glibc库导致的:

ubuntu: sudo apt-get install libc6-dev-i386

CentOS:yum -y install glibc-devel.i686

错误提示2:

/usr/include/stdio.h:27:10: fatal error: bits/libc-header-start.h: No such file or directory

解决办法:

其实主要是gcc安装环境没有安装完善。

可以尝试输入sudo apt-get install gcc-multilib即可.

其他错误:

如果还有其他,一般是不支持32位安装,可以取消。--enable-multilib改为--disable-multilib。

3.5 gcc、g++、gcj设置

  要想使用GCC-7.5.0的gcc等命令,简单的方法就是把它的路径${destdir}/bin放在环境变量PATH中。我不用这种方式,而是用符号连接的方式实现,这样做的好处是我仍然可以使用系统上原来的旧版本的GCC编译器。

  而原来gcc的路径是在usr/bin下。我们可以把旧版gcc-7.5.0中的gcc、g++、gcj等命令在/usr/bin目录下分别做一个符号连接, 链接成其他命令, 新的gcc-10.2.0作为默认编译项:

$ cd /usr/bin

$ ln -s /usr/local/gcc-7.5.0/bin/gcc gcc750

$ ln -s /usr/local/gcc-7.5.0/bin/g++ g++750

$ ln -s /usr/local/gcc-7.5.0/bin/gcj gcj750

$ ln -s /usr/local/gcc-10.2.0/bin/gcc gcc

$ ln -s /usr/local/gcc-10.2.0/bin/g++ g++

$ ln -s /usr/local/gcc-10.2.0/bin/gcj gcj

  这样,就可以分别使用gcc750、g++750、gcj750来调用旧版GCC-7.5.0的gcc、g++、gcj完成对C、C++、JAVA程序的编译了。

同时,仍然能够使用新版本的GCC-10.2.0编译器中的gcc、g++等命令。

3.6 库路径的设置

将${destdir}/lib路径添加到环境变量LD_LIBRARY_PATH中,例如,如果GCC-10.2.0安装在/usr/local/gcc-10.2.0目录下,在RH Linux下可以直接在命令行上执行

$ export LD_LIBRARY_PATH=/usr/local/gcc-10.2.0/lib

最好添加到系统的配置文件中,这样就不必要每次都设置这个环境变量了,在文件$HOME/.bash_profile中添加下面两句:

LD_LIBRARY_PATH=:/usr/local/gmp-6.2.1/lib:/usr/local/mpfr-4.1.0/lib:/usr/local/mpc-1.2.1/lib:/usr/local/gcc-10.2.0/lib64

export LD_LIBRARY_PATH

或者在/etc/bash_profile 下添加。

重启系统设置生效,或者执行命令

$ source $HOME/.bash_profile

或者:

$ source /etc/bash_profile

用新的编译命令(gcc、g++等)编译你以前的C、C++程序,检验新安装的GCC编译器是否能正常工作。

完成了Linux安装GCC,之后你就能轻松地编辑编译了。

4 安装gcc方法二

4.1安装依赖库

gcc依赖了mpfr、gmp、mpc 和is这四个库,现在在gcc的文件中整合了一个shell脚本,我们通过执行脚本文件快速安装依赖。注意:该脚本需要在gcc文件夹内执行。

[root@localcomputor gcc-10.2.0]# ./contrib/download_prerequisites

4.2 配置

进入gcc目录内,执行配置命令。

4.2.1建立编译输出文件。

$ ./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

4.2.2配置命令如下

$ ./configure --prefix=/usr/local/gcc-10.2.0 --enable-checking=release --enable-languages=c,c++ --disable-multilib

如果不是在所期望安装的目录中还需要加上--prefix=/usr/local/gcc-10.2.0 后面改成你自己的目录。

对上述命令进行说明一下:

  • –enable-languages=c,c++:只需要支持c/c++编译器即可。
  • –disable-multilib:指不需要支持多平台的gcc,如果是64位就仅安装64位的gcc。也可以选择支持。选择支持的话,你要先安装32位的开发库,命令如下:

sudo yum install libgcc.i686

sudo yum install glibc-devel.i686

4.2.3编译

# make -j2

-j的功能如下:

-j [jobs], --jobs[=jobs]
            Specifies the number of jobs (commands) to run simultaneously.  If there is more than one -j option, the last one
            is effective.  If the -j option is given without an argument, make will not limit the number of jobs that can run
            simultaneously.

简单来说就是制定同时运行的作业数,相当于多线程。后面的数字自己根据机器的配置定义。不要太高,可能会出现内存溢出的情况。

别问我怎么知道的。。。make clean清除之前失败编译的结果。重新编译。编译需要很长时间,运行数越高,时间越短。

# make install

编译安装成功后

$ gcc -v

测试gcc版本。

到这里安装gcc结束。

5 安装 glibc

下载glibc库. 地址 Index of /gnu/glibcglibc-2.32.tar.gz

$ tar zxvf glibc-2.32.tar.gz

$ cd glibc-2.32

$ mkdir temp

$ cd temp

$ ../configure --prefix=/usr/local/glibc-2.32 --with-headers=/usr/include

$ make -j4

$ make install

安装的时候等挺长时间。

看看现在libc.so.6在哪个位置,然后修改软链接

ln -s  /usr/local/glibc-2.32/lib/libc-2.32.so   /lib64/libc.so.6

添加配置路径:

$ vim /etc/profile   //或 ~/.bash_profile

//在文件里加入这一行,保存退出

export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/usr/local/glibc-2.32/lib

$ source /etc/profile   //或 ~/.bash_profile

或者退出重启链接.

完成安装.

猜你喜欢

转载自blog.csdn.net/shaderdx/article/details/110859700