以 gcc 5.4.0 版本为例,介绍用源码来编译安装 gcc 的方法
一、安装 gcc
1、解压缩
把 gcc-5.4.0.tar.gz 拷贝到系统中的某个目录,比如 /usr/local/src,并解压到此目录:
tar zxf gcc-5.4.0.tar.gz
2、创建安装目录
gcc 的安装目录一般是 /usr/local/gcc-5.4.0,关于此目录的含义可以参考:https://blog.csdn.net/lina_acm/article/details/78224656
mkdir /usr/local/gcc-5.4.0/
mkdir /usr/local/src/gcc-5.4.0/build # build 目录用来存放 Makefile 等文件
3、配置安装文件
通过执行 configure 来配置 gcc 安装安装到什么位置、支持什么语言等等:
cd /usr/local/src/gcc-5.4.0/build
/usr/local/src/gcc-5.4.0/configure \
--prefix=/usr/local/gcc-5.4.0 \
--enable-threads=posix \
--disable-multilib \
--enable-languages=c,c++
# --prefix=/usr/local/gcc-5.4.0 指定安装路径
# --enable-languages=c,c++ 支持的编程语言
# --enable-threads=posix 使用POSIX/Unix98作为线程支持库
# --disable-multilib 取消多目标库编译(在64位系统中是取消32位库编译)
更多的参数说明可以在 configure 参数中加上 -h 来显示
如果出现如下错误,说明需要安装 GMP、MPFR、MPC 这三个库,可以按照后面第二部分的说明来安装:
configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.
安装完三个依赖的库之后,重新执行 configure,不过要加上三个库的安装路径作为参数:
cd /usr/local/src/gcc-5.4.0/build
/usr/local/src/gcc-5.4.0/configure \
--prefix=/usr/local/gcc-5.4.0 \
--enable-threads=posix \
--disable-multilib \
--enable-languages=c,c++ \
--with-gmp=/usr/local/gmp-6.1.0 \
--with-mpfr=/usr/local/mpfr-3.1.4 \
--with-mpc=/usr/local/mpc-1.0.3
4、安装 gcc
cd /usr/local/src/gcc-5.4.0/build
make -j4
make install
-j 参数用来设置多线程编译
make 执行的时间很长
5、切换 gcc 版本
先确认一下当前 gcc 的版本,然后改成其它名字,不然后面的步骤不生效:
/usr/bin/gcc -v
...
gcc 版本 4.9.2 20141101 (Red Hat 4.9.2-1) (GCC)
...
mv /usr/bin/gcc /usr/bin/gcc-4.9.2
用 alternatives 命令添加 gcc 版本:
alternatives --install /usr/bin/gcc gcc /usr/bin/x86_64-redhat-linux-gcc 50
alternatives --install /usr/bin/gcc gcc /usr/local/gcc-5.4.0/bin/gcc 40
alternatives --install <链接> <名称> <路径> <优先度>
优先级用在 auto 模式下,数字越大优先级越高
输入数字选择版本:
[root@localhost bin]# alternatives --config gcc
共有 2 个提供“gcc”的程序。
选项 命令
*+ 1 /usr/bin/x86_64-redhat-linux-gcc
2 /usr/local/gcc-5.4.0/bin/gcc
按 Enter 保留当前选项[+],或者键入选项编号:2
*表示优先级最高的,+表示当前系统使用的
更多参数可以直接输入 alternatives 来显示
最后确认一下:
gcc -v
同理设置一下 g++ 的版本
6、其它
在实际使用中还有一些其它操作需要完成,详见第三部分
.
二、安装 GMP、MPFR、MPC
可以自动安装依赖,在 gcc 解压后的根目录执行如下命令即可:
./contrib/download_prerequisites
使用自动安装则不用在 configure 的参数中填写这三个库的路径,手动安装见下
.
.
MPFR 依赖 GMP,而 MPC 依赖 GMP 和 MPFR,所以要先安装 GMP,其次 MPFR,最后才是 MPC
以解压到 /usr/local/src/ 目录、安装到 /usr/local/ 目录为例
1、安装 gmp-6.1.0
tar jxf gmp-6.1.0.tar.bz2
mkdir /usr/local/gmp-6.1.0
mkdir /usr/local/src/gmp-6.1.0/build
cd /usr/local/src/gmp-6.1.0/build
/usr/local/src/gmp-6.1.0/configure --prefix=/usr/local/gmp-6.1.0/
make
make install
2、安装 mpfr-2.4.2
tar jxf mpfr-3.1.4.tar.bz2
mkdir /usr/local/mpfr-3.1.4
mkdir /usr/local/src/mpfr-3.1.4/build
cd /usr/local/src/mpfr-3.1.4/build
/usr/local/src/mpfr-3.1.4/configure --prefix=/usr/local/mpfr-3.1.4 --with-gmp=/usr/local/gmp-6.1.0
make
make install
3、安装 mpc-0.8.1
tar zxf mpc-1.0.3.tar.gz
mkdir /usr/local/mpc-1.0.3
mkdir /usr/local/src/mpc-1.0.3/build
cd /usr/local/src/mpc-1.0.3/build
/usr/local/src/mpc-1.0.3/configure --prefix=/usr/local/mpc-1.0.3 \
--with-gmp=/usr/local/gmp-6.1.0 --with-mpfr=/usr/local/mpfr-3.1.4
make
make install
.
三、其它问题
1、GLIBCXX_3.4.21 或 CXXABI_1.3.9 找不到
安装完成后,在使用时可能出现如下的错误提示:
/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found
/lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found
这是因为没有用新安装的 gcc 动态库替换旧的,首先确定一下当前使用的动态库内容:
[root@localhost bin]# strings /usr/lib64/libstdc++.so.6 | grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_1.3.8
CXXABI_TM_1
[root@localhost bin]# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH
可以看到当前使用的动态库没有包含新的版本,解决方法,用新安装的 gcc 库替换旧的,建立软连接即可:
(根据实际复制 lib、lib64 目录)
cp /usr/local/gcc-5.4.0/lib64/libstdc++.so.6.0.21 /usr/lib64/
rm /usr/lib64/libstdc++.so.6
ln -s /usr/lib64/libstdc++.so.6.0.21 /usr/lib64/libstdc++.so.6
2、某些情况下 g++ 的版本还是没有切换过来
这有可能是因为 c++ 的指向不对,先查看一下当前的 c++:
[root@localhost bin]# which c++
/usr/lib64/ccache/c++
[root@localhost bin]# ll /usr/lib64/ccache/c++
lrwxrwxrwx 1 root root 16 4月 11 2017 /usr/lib64/ccache/c++ -> ../../bin/ccache
删掉旧的 c++,重新建立一个软连接指向 g++ 即可:
mv /usr/lib64/ccache/c++ /usr/lib64/ccache/c++_bak
ln -s /usr/bin/g++ /usr/lib64/ccache/c++
.