背景说明
由于所在团队代码使用了c++11的相关特性,而大项目CI服务器(ubuntu server)上默认安装的是gcc-4.8,因此首先需要安装gcc-4.9,然后能够做到按需选择gcc版本来编译不同的工程代码。还需要交代的是:由于信息安全服务器无法直接访问外网,而是使用内部的一个ubuntu mirror服务器来完成apt相关操作。
尝试直接安装4.9
首先想到的是通过指定gcc版本来安装:
sudo apt-get install gcc-4.9
看起来安装成功了,但是usr/bin下面的gcc依旧是4.8:(
如果可以直接访问外部网络,可以按照下面的方式来安装gcc-4.9
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install g++-4.9
下载GCC-4.9.3
在能够访问外部网络的环境下,下载gcc-4.9.3并下载相关依赖项(例如:gmp、mpfr、mpc等)。
wget https://ftp.gnu.org/gnu/gcc/gcc-4.9.3/gcc-4.9.3.tar.gz
tar xzf gcc-4.9.3.tar.gz
cd gcc-4.9.3
./contrib/download_prerequisites
编译
接下来开始编译gcc-4.9.3:
cd ..
mkdir objdir
cd objdir
../gcc-4.9.3/configure --prefix=$HOME/gcc-4.9.3 --enable-languages=c,c++,fortran,go --disable-multilib
make
错误1
在编译的过程中首先出现如下错误:
WARNING: ‘makeinfo’ is missing on your system. You should only need it if you modified a ‘.texi’ or ’.texinfo’ file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy `make’ (AIX, DU, IRIX). You might want to install the ’Texinfo’ package or the ‘GNU make’ package. Grab either from any GNU archive site.
通过安装texinfo解决:
sudo apt-get install texinfo
错误2
继续make,又出现另一个错误:
WARNING: ‘aclocal-1.11’ is missing on your system. You should only need it if you modified ‘acinclude.m4’ or ‘configure.ac’ or m4 files included by ‘configure.ac’. The ‘aclocal’ program is part of the GNU Automake package: <http://www.gnu.org/software/automake> It also requires GNU Autoconf, GNU m4 and Perl in order to run: <http://www.gnu.org/software/autoconf> <http://www.gnu.org/software/m4/> <http://www.perl.org/>
根据之前的经验安装automake可以解决:
sudo apt-get install automake
继续make,但是会出现automake版本和aclocal-1.11版本不一致的错误,这是由于直接安装automake的版本是1.14导致。 因此需要重新下载automake-1.11并且编译安装:
./configure
make
make install
继续make问题解决,整个make过程持续了将近3个小时。
安装
接下来进行安装:
make install
在gcc目录的子目录bin下面可以看到gcc相关文件都已生成,执行gcc -v查看版本为4.9.3.
清理
删除编译产生的中间文件。
rm -rf ~/objdir
rm -f ~/gcc-4.9.3.tar.gz
路径添加
可以把gcc-4.9.3的路径添加到环境变量PATH中去:
export PATH=$HOME/gcc-4.9.3/bin:$PATH
export LD_LIBRARY_PATH=$HOME/gcc-4.9.3/lib:$HOME/gcc-4.9.3/lib64:$LD_LIBRARY_PATH
工程修改
修改 CMakeLists.txt 文件,添加如下命令:
SET(CMAKE_C_COMPILER "/home/public/local/bin/gcc-4.9.3")
SET(CMAKE_CXX_COMPILER "/home/public/local/bin/g++-4.9.3")
以便工程能够使用刚编译生成的gcc-4.9.3。
多版本兼容
如果不想修改工程中的CMakeLists文件,可以按照下述方法来完成:
sudo update-alternatives --install /usr/bin/gcc gcc /home/public/local/bin/gcc-4.9 40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
其中40、50为优先级,输入下面命令查看gcc候选项:
sudo update-alternatives --config gcc
候选项:
| 选择 | 路径 | 优先级 | 状态 | | — | — | — | — | | 0 | /usr/bin/gcc-4.8 | 50 | 自动模式 | | 1 | /usr/bin/gcc-4.8 | 50 | 手动模式 | | 2 | /home/public/local/bin/gcc-4.9.3 | 50 | 手动模式 | 要维持当前值[]直接按回车键即可,或者键入编号进行版本切换。 同样也适用于g++的设定。
小结
- 如果访问外部网络没有障碍,直接添加apt仓库添加即可。
- 如果自行编译安装gcc则事先先把一些依赖程序安装好,例如:texinfo、automake等。
- gcc多版本共存可通过update-alternatives来灵活配置。
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!