GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码。
GCC是Linux平台下最常用的编译程序,它是Linux平台编译器的事实标准。同时,在Linux平台下的嵌入式开发领域,GCC也是用得最普遍的一种编译器。GCC之所以被广泛采用,是因为它能支持各种不同的目标体系结构。例如,它既支持基于宿主的开发(简单讲就是要为某平台编译程序,就在该平台上编译),也支持交叉编译(即在A平台上编译的程序是供平台B使用的)。目前,GCC支持的体系结构有四十余种,常见的有X86系列、Arm、PowerPC等。同时,GCC还能运行在不同的操作系统上,如Linux、Solaris、Windows等。
除了上面讲的之外,GCC除了支持C语言,还支持多种其他语言,例如C++、Ada、Java、Objective-C、FORTRAN、Pascal、go等。
基本上很多应用在编译安装时需要使用到gcc,一般使用的版本不是很高所以通过快捷安装命令即可:
yum install -y gcc-c++
但有的应用编译时需要更高版本的gcc,这个时候基本上只能通过编译安装,而gcc编译安装非常麻烦,需要几个指定版本的依赖组件才能编译安装成功,为方便安装特意编写了一个安装shell脚本,通过脚本来无人安装,当然安装编译过程还是有点长的,脚本暂只支持以CentOS系统(系统版本5~7有测试过)来安装(其它系统需要调整下快速安装组件命令 yum 和对应的安装包名)
#!/bin/bash
# 官网 https://gcc.gnu.org/## 下载地址 (镜像)# https://gcc.gnu.org/mirrors.html## 依赖说明# https://gcc.gnu.org/install/prerequisites.html## 命令参数# $1 指定安装版本,如果不传则获取最新版本号,为 new 时安装最新版本##GCC version numberGCC_VERSION=$1# GCC安装基目录INSTALL_BASE="/usr/local/gcc/"# 必需的库基目录INSTALL_PACKAGE_BASE="/usr/local/"# gcc 编译配置GCC_CONFIGURE_WITH=# 镜像地址MIRRORS_URL="http://mirror.linux-ia64.org/gnu/gcc"if [ -z $1 ] || [[ $1 == "new" ]]; thenecho "gcc version is empty!"echo "获取最新稳定版本号 ...";GCC_VERSION=`curl $MIRRORS_URL/releases/ 2>&1| grep -P gcc-d+.d+.d+ -o|tail -n 1|grep -P d+.d+.d+ -o`if [ -z "$GCC_VERSION" ];thenecho "获取版失败!";exitfiif [ -z $1 ]; thenecho $GCC_VERSIONexitfifiif [ -e "$INSTALL_BASE$GCC_VERSION/bin/gcc" ];thenecho "gcc-$GCC_VERSION already install!"exitfiOLD_PATH=`pwd`if [[ "$0" =~ / ]]; thencd "`echo "$0" | grep -P (/?[^/]+/)+ -o`"CURRENT_PATH=`pwd`cd $OLD_PATHelseCURRENT_PATH=$OLD_PATHfiif [ ! -d "gcc" ];thenmkdir gccficd gccif [ ! -e "gcc-$GCC_VERSION.tar.gz" ]; then#download phpecho "download gcc-$GCC_VERSION.tar.gz";wget $MIRRORS_URL/releases/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.gz 2>&1fiif [ ! -d "gcc-$GCC_VERSION" ]; then#decompressionecho "decompression gcc-$GCC_VERSION.tar.gz";tar -zxf gcc-$GCC_VERSION.tar.gzfiif [ ! -d "gcc-$GCC_VERSION" ]; thenecho "gcc-$GCC_VERSION dir is not exists"exitfiecho "install dependence"yum install -y gcc-c++ bzip2 ntpdate m4# 时间不同步容易造成配置死循环ntpdate -u ntp.api.bz# while 循环使用的是管道,会开启子进程,无法修改外部的变量PACKAGE_LISTS=`cat gcc-$GCC_VERSION/contrib/download_prerequisites| grep -P -d+.d+(.d+)?.tar`for LINE in `echo -e $PACKAGE_LISTS`doPACKAGE_VERSION_FILE=`echo $LINE|grep -P w+-d+.d+(.d+)?.tar.(bz2|gz) -o`PACKAGE=`echo $PACKAGE_VERSION_FILE|grep -P ^w+ -o`PACKAGE_VERSION_DIR=`echo $PACKAGE_VERSION_FILE|grep -P w+-d+.d+(.d+)? -o`PACKAGE_VERSION=`echo $PACKAGE_VERSION_DIR|grep -P d+.d+(.d+)? -o`PACKAGE_CONFIGURE_WITH=$GCC_CONFIGURE_WITHGCC_CONFIGURE_WITH="$PACKAGE_CONFIGURE_WITH --with-$PACKAGE=$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION"echo "install $PACKAGE_VERSION_DIR"if [ -d "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION" ]; thenecho "$PACKAGE_VERSION_DIR already install";continue;fiif [ ! -e "$PACKAGE_VERSION_FILE" ]; then#download packageecho "download $PACKAGE_VERSION_FILE";wget $MIRRORS_URL/infrastructure/$PACKAGE_VERSION_FILE 2>&1fiif [ ! -d "$PACKAGE_VERSION_DIR" ]; then#decompressionecho "decompression $PACKAGE_VERSION_FILE";if [ -n "`echo $PACKAGE_VERSION_FILE|grep -P .gz$`" ];thentar -zxf $PACKAGE_VERSION_FILEelsetar -xf $PACKAGE_VERSION_FILEfifiif [ ! -d "$PACKAGE_VERSION_DIR" ]; thenecho "$PACKAGE_VERSION_DIR dir is not exists"exitficd $PACKAGE_VERSION_DIRif [[ "$PACKAGE" == "isl" ]];thenPACKAGE_CONFIGURE_WITH= --with-gmp-prefix=`echo $PACKAGE_CONFIGURE_WITH|grep -P "[^=]+gmp/d+.d+.d+" -o`fiecho "./configure --prefix=$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION$PACKAGE_CONFIGURE_WITH"./configure --prefix=$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION$PACKAGE_CONFIGURE_WITH 2>&1make 2>&1make install 2>&1if [ ! -d "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION" ] || [ -z "`ls $INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION`" ];thenecho "$PACKAGE-$PACKAGE_VERSION install fail!"exitfiif [[ "$PACKAGE" == "isl" ]];thenecho "mv lib/*.py file"# 清除py文件,这些文件会影响共享的动态链接库ldconfig命令执行失败for PY_FILE in `find $INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION/lib/ -name "*.py"`doif [ -n "$PY_FILE" ] && [ -e "$PY_FILE" ];thenecho "mv $PY_FILE $INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION"mv $PY_FILE $INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSIONfidonefi# 共享的动态链接库,加载配置if [ -d "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION/lib" ] && [ -z "`cat /etc/ld.so.conf|grep "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION"`" ];thenecho "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION/lib" >> /etc/ld.so.confldconfigficd ../donecd gcc-$GCC_VERSIONecho "install gcc"make clean 2>&1# 64位系统需要禁用multilibif [ -n "`uname -a|grep -P eld+.xd+_d+ -o|grep x86_64 -o`" ]; thenGCC_CONFIGURE_WITH=$GCC_CONFIGURE_WITH --disable-multilibfi# 新版需要下载配置文件if [ ! -e "./configure" ] && [ -e "./contrib/download_prerequisites" ];then./contrib/download_prerequisitesmkdir gcc-make-tmpcd gcc-make-tmpecho "../configure --prefix=$INSTALL_BASE$GCC_VERSION$GCC_CONFIGURE_WITH"../configure --prefix=$INSTALL_BASE$GCC_VERSION$GCC_CONFIGURE_WITH 2>&1elseecho "./configure --prefix=$INSTALL_BASE$GCC_VERSION$GCC_CONFIGURE_WITH"./configure --prefix=$INSTALL_BASE$GCC_VERSION$GCC_CONFIGURE_WITH 2>&1fiHTREAD_NUM=`lscpu |grep Thread|grep -P d+$ -o`make -j $HTREAD_NUM 2>&1make install 2>&1# check install statusif [ ! -d "$INSTALL_BASE$GCC_VERSION" ] || [ -z "`ls $INSTALL_BASE$GCC_VERSION`" ]; thenecho "[error] install gcc-$GCC_VERSION fail!";elseecho "$INSTALL_BASE$GCC_VERSION/lib64" >> /etc/ld.so.confecho "mv lib64/*.py file"# 清除py文件,这些文件会影响共享的动态链接库ldconfig命令执行失败for PY_FILE in `find $INSTALL_BASE$GCC_VERSION/lib64/ -name "*.py"`doif [ -n "$PY_FILE" ] && [ -e "$PY_FILE" ];thenecho "mv $PY_FILE $INSTALL_BASE$GCC_VERSION"mv $PY_FILE $INSTALL_BASE$GCC_VERSIONfidoneldconfigecho export PATH=$PATH:"$INSTALL_BASE$GCC_VERSION/bin" >> /etc/profilesource /etc/profileyum remove -y gcc-c++echo "install gcc-$GCC_VERSION success!";fi
使用方法:
在root账号下,创建一个.sh后缀的shell脚本文件,比如:gcc-install.sh 并把上面安装代码写入保存。
执行安装命令
bash gcc-install.sh new
如果系统的依赖过少导致安装不成功,则需要增加对应的依赖包(这里只以测试系统为例依赖包可能安装不是很充足),安装目录可以在安装脚本中去配置修改,安装成功后会提示安装成功文案。
0 留言