在一台没有管理员权限的 CentOS 7 上,我想要安装的某个软件需要用到 CMake,但是没有安装。编译 CMake 的时候报错不支持 c++11 标准。 gcc -v
一看,果然,版本 4.8。接下来就是编译安装最新版 GCC(10.4)了。
操作系统 此次的服务器是 CentOS 7。
1 2 $ uname -r 3.10.0-862.el7.x86_64
安装依赖 GCC 有三个必选的依赖:mpc 、mpfr 、gmp 。可以联网的服务器可以使用 gcc 自带的脚本./contrib/download_prerequisites
下载解压,但是这个服务器无法联网,所以先下载到我自己的电脑上再上传。
阅读脚本可知,所需三个依赖的版本和 URL 分别为:
1 2 3 http://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 http://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.6.tar.bz2 http://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz
上传脚本到服务器的 GCC 源码目录,注释掉脚本里下载压缩包的部分(如下所示),然后运行指令./contrib/download_prerequisites --no-isl --no-verify
。之后就可以编译了。
1 2 3 4 5 6 7 8 9 for ar in $(echo_archives)do if [ ${force} -gt 0 ]; then rm -f "${directory} /${ar} " ; fi [ -e "${directory} /${ar} " ] \ || ${fetch} --no-verbose -O "${directory} /${ar} " "${base_url} ${ar} " \ || die "Cannot download ${ar} from ${base_url} " done unset ar
编译 GCC GCC 要编译三次 ,真是漫长的等待。
1 2 3 4 5 6 7 cd gcc-10.4.0/mkdir build && cd build../configure \ --disable-multilib \ --prefix=$HOME /.gcc/10.4.0 \ --enable-languages=c,c++,fortran
安装目录指定为$HOME/.gcc/10.4.0
。 disable-multilib
意为只编译 64 位系统相关文件,跳过 32 位系统相关的编译任务。 enable-languages
指定只编译 c、c++、fortran 三种语言的编译器,其实 gcc 还可以支持这些语言:c, ada, c++, go, brig, d, fortran, objc, obj-c++, gm2。
安装 GCC 1 2 3 make install ln -s $HOME /.gcc/10.2.0 $HOME /.gcc/default
make install
似乎还有一些编译任务要执行,可以指定多线程数加速。下面一行创建软连接是方便以后切换版本。之后需要在.bashrc
里添加一些全局变量:
1 2 3 4 5 6 7 export PATH=$HOME /.gcc/default/bin:$PATH export LD_LIBRARY_PATH=$HOME /.gcc/10.2.0/lib64:$LD_LIRBARY_PATH export CC=$HOME /.gcc/default/bin/gccexport CXX=$HOME /.gcc/default/bin/g++export FC=$HOME /.gcc/default/bin/gfortran
CMake 编译选项 当使用 CMake 编译软件的时候,可以使用如下代码指定编译器:
1 2 3 4 5 6 cmake \ -DCMAKE_C_COMPILER=$HOME /.gcc/default/bin/gcc \ -DCMAKE_CXX_COMPILER=$HOME /.gcc/default/bin/g++ \ -DCMAKE_Fortran_COMPILER=$HOME /.gcc/default/bin/gfortran \ -DCMAKE_PREFIX_PATH=$HOME /.gcc/default \ -B build -S .
碎碎念 昨晚要安装一个软件,需要先安装 C++ 的 YAML 库。编译安装 YAML 需要 CMake,而 CMake 编译失败了,因为需要 gcc 支持 c++11 标准。但是,gcc 4.8 是好多年前的编译器了,早在我刚上高中的时候这个版本还都是最火的 gcc 版本(当然现在很过时了)。于是安装 gcc。一开始没看文档,折腾了一晚上。今早照着别人的教程安装,被依赖版本毒打,因为我安装的版本都太新了,而且据(GCC Wiki)说,如果我编译 GCC 的时候是动态链接这三个库的,那么之后运行 GCC 的时候总要动态链接这三个库,也就是需要把他们加入编译器全局变量里。
这显然是不能接受的。我只是想临时地使用这三个库,不想以后我的所有程序都要链接他们。最后,对着 GCC 官方 Wiki,终于安装成功了。
事实证明,即使是 GCC 4.8,也是可以编译 GCC 10.4 的!
虽然后来在服务器上发现了 GCC 11.2,但是事到如今装都装了……
Fin.