GCC是GUN Compiler Collection的简称,除了编译程序以外,它还含其余相关工具,它能把易于人类使用的高级语言编写的源代码构建成计算机可以直接执行的二进制代码。GCC是Linux平台下最经常使用的编译程序,它是Linux平台编译器的事实标准。同时,在Linux平台下的嵌入式开发领域,GCC也是用得最广泛的一种编译器。GCC之因此被普遍采用,是由于它能支持各类不一样的目标体系结构。例如,它既支持基于宿主的开发(简单讲就是要为某平台编译程序,就在该平台上编译),也支持交叉编译(即在A平台上编译的程序是供平台B使用的)。目前,GCC支持的体系结构有四十余种,常见的有X86系列、Arm、PowerPC等。同时,GCC还能运行在不一样的操做系统上,如Linux、Solaris、Windows等。html
除了上面讲的以外,GCC除了支持C语言,还支持多种其余语言,例如C++、Ada、Java、Objective-C、FORTRAN、Pascal、go等。c++
基本上不少应用在编译安装时须要使用到gcc,通常使用的版本不是很高因此经过快捷安装命令便可:shell
yum install -y gcc-c++
但有的应用编译时须要更高版本的gcc,这个时候基本上只能经过编译安装,而gcc编译安装很是麻烦,须要几个指定版本的依赖组件才能编译安装成功,为方便安装特地编写了一个安装shell脚本,经过脚原本无人安装,固然安装编译过程仍是有点长的,脚本暂只支持以CentOS系统(系统版本5~7有测试过)来安装(其它系统须要调整下快速安装组件命令 yum 和对应的安装包名)api
#!/bin/bash # 官网 https://gcc.gnu.org/ # # 下载地址 (镜像) # https://gcc.gnu.org/mirrors.html # # 依赖说明 # https://gcc.gnu.org/install/prerequisites.html # # 命令参数 # $1 指定安装版本,若是不传则获取最新版本号,为 new 时安装最新版本 # #GCC version number GCC_VERSION=$1 # GCC安装基目录 INSTALL_BASE="/usr/local/gcc/" # 必需的库基目录 INSTALL_PACKAGE_BASE="/usr/local/" # gcc 编译配置 GCC_CONFIGURE_WITH='' # 镜像地址,若是地址不可用可去 https://gcc.gnu.org/mirrors.html 找合适的地址 MIRRORS_URL="https://bigsearcher.com/mirrors/gcc/" # 判断默认镜像是否好用 if [ -z "`curl --connect-timeout 20 -I -X HEAD $MIRRORS_URL/releases/ 2>&1| grep '200 OK'`" ];then # 获取最快的镜像地址 MIRRORS_URLS=`curl https://gcc.gnu.org/mirrors.html 2>&1 | grep -P 'http(s)?://([\w\-]+\.)+\w+/(\w+/)?gcc/' -o| uniq` MIRRORS_URL='' MIRRORS_HOST_PING_TIME='' for LINE in `echo -e $MIRRORS_URLS` do MIRRORS_HOST=`echo $LINE|grep -P 'http(s)?://([\w\-]+\.)+\w+/' -o|grep -P '([\w\-]+\.)+\w+' -o` PING_TIME=`ping -c 1 -W 10 $MIRRORS_HOST|grep -P 'time=\d+' -o|grep -P '\d+' -o` if [ -n "$PING_TIME" ] && [ -n "`curl --connect-timeout 20 -I -X HEAD $LINE/releases/ 2>&1| grep '200 OK'`" ];then if [ "$PING_TIME" -lt 150 ];then MIRRORS_URL=$LINE break fi MIRRORS_HOST_PING_TIME="$MIRRORS_HOST_PING_TIME$PING_TIME,$LINE\n" fi done if [ -z "$MIRRORS_URL" ];then MIRRORS_URL=`echo -e "$MIRRORS_HOST_PING_TIME"|grep -P '^\d+'|sort -n -t ',' -k 1|head -n 1|grep -P 'http.*$' -o` fi if [ -z "$MIRRORS_URL" ];then echo '没有找到可用的镜像下载地址' exit fi fi if [ -z $1 ] || [[ $1 == "new" ]]; then echo "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" ];then echo "获取版失败!"; exit fi if [ -z $1 ]; then echo $GCC_VERSION exit fi fi if [ -e "$INSTALL_BASE$GCC_VERSION/bin/gcc" ];then echo "gcc-$GCC_VERSION already install!" exit fi OLD_PATH=`pwd` if [[ "$0" =~ '/' ]]; then cd "`echo "$0" | grep -P '(/?[^/]+/)+' -o`" CURRENT_PATH=`pwd` cd $OLD_PATH else CURRENT_PATH=$OLD_PATH fi if [ ! -d "gcc" ];then mkdir gcc fi cd gcc if [ ! -e "gcc-$GCC_VERSION.tar.gz" ]; then #download echo "download gcc-$GCC_VERSION.tar.gz"; wget $MIRRORS_URL/releases/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.gz 2>&1 fi if [ ! -d "gcc-$GCC_VERSION" ]; then #decompression echo "decompression gcc-$GCC_VERSION.tar.gz"; tar -zxf gcc-$GCC_VERSION.tar.gz fi if [ ! -d "gcc-$GCC_VERSION" ]; then echo "gcc-$GCC_VERSION dir is not exists" exit fi echo "install dependence" yum install -y gcc-c++ bzip2 ntpdate m4 # 时间不一样步容易形成配置死循环 ntpdate -u ntp.api.bz # apt-get install -y g++ # while 循环使用的是管道,会开启子进程,没法修改外部的变量 PACKAGE_LISTS=`cat gcc-$GCC_VERSION/contrib/download_prerequisites| grep -P '\-\d+\.\d+(\.\d+)?\.tar'` for LINE in `echo -e $PACKAGE_LISTS` do PACKAGE_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_WITH GCC_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" ]; then echo "$PACKAGE_VERSION_DIR already install"; continue; fi if [ ! -e "$PACKAGE_VERSION_FILE" ]; then #download package echo "download $PACKAGE_VERSION_FILE"; wget $MIRRORS_URL/infrastructure/$PACKAGE_VERSION_FILE 2>&1 fi if [ ! -d "$PACKAGE_VERSION_DIR" ]; then #decompression echo "decompression $PACKAGE_VERSION_FILE"; if [ -n "`echo $PACKAGE_VERSION_FILE|grep -P '\.gz$'`" ];then tar -zxf $PACKAGE_VERSION_FILE else tar -xf $PACKAGE_VERSION_FILE fi fi if [ ! -d "$PACKAGE_VERSION_DIR" ]; then echo "$PACKAGE_VERSION_DIR dir is not exists" exit fi cd $PACKAGE_VERSION_DIR if [[ "$PACKAGE" == "isl" ]];then PACKAGE_CONFIGURE_WITH=' --with-gmp-prefix='`echo $PACKAGE_CONFIGURE_WITH|grep -P "[^=]+gmp/\d+\.\d+\.\d+" -o` fi echo "./configure --prefix=$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION$PACKAGE_CONFIGURE_WITH" ./configure --prefix=$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION$PACKAGE_CONFIGURE_WITH 2>&1 make 2>&1 make install 2>&1 if [ ! -d "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION" ] || [ -z "`ls $INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION`" ];then echo "$PACKAGE-$PACKAGE_VERSION install fail!" exit fi if [[ "$PACKAGE" == "isl" ]];then echo "mv lib/*.py file" # 清除py文件,这些文件会影响共享的动态连接库ldconfig命令执行失败 for PY_FILE in `find $INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION/lib/ -name "*.py"` do if [ -n "$PY_FILE" ] && [ -e "$PY_FILE" ];then echo "mv $PY_FILE $INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION" mv $PY_FILE $INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION fi done fi # 共享的动态连接库,加载配置 if [ -d "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION/lib" ] && [ -z "`cat /etc/ld.so.conf|grep "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION"`" ];then echo "$INSTALL_PACKAGE_BASE$PACKAGE/$PACKAGE_VERSION/lib" >> /etc/ld.so.conf ldconfig fi cd ../ done cd gcc-$GCC_VERSION echo "install gcc" make clean 2>&1 # 64位系统须要禁用multilib if [ -n "`uname -a|grep -P 'el\d+\.x\d+_\d+' -o|grep x86_64 -o`" ]; then GCC_CONFIGURE_WITH=$GCC_CONFIGURE_WITH' --disable-multilib' fi # 新版须要下载配置文件 if [ ! -e "./configure" ] && [ -e "./contrib/download_prerequisites" ];then ./contrib/download_prerequisites mkdir gcc-make-tmp cd gcc-make-tmp echo "../configure --prefix=$INSTALL_BASE$GCC_VERSION$GCC_CONFIGURE_WITH" ../configure --prefix=$INSTALL_BASE$GCC_VERSION$GCC_CONFIGURE_WITH 2>&1 else echo "./configure --prefix=$INSTALL_BASE$GCC_VERSION$GCC_CONFIGURE_WITH" ./configure --prefix=$INSTALL_BASE$GCC_VERSION$GCC_CONFIGURE_WITH 2>&1 fi HTREAD_NUM=`lscpu |grep Thread|grep -P '\d+$' -o` make -j $HTREAD_NUM 2>&1 make install 2>&1 # check install status if [ ! -d "$INSTALL_BASE$GCC_VERSION" ] || [ -z "`ls $INSTALL_BASE$GCC_VERSION`" ]; then echo "[error] install gcc-$GCC_VERSION fail!"; else echo "$INSTALL_BASE$GCC_VERSION/lib64" >> /etc/ld.so.conf echo "mv lib64/*.py file" # 清除py文件,这些文件会影响共享的动态连接库ldconfig命令执行失败 for PY_FILE in `find $INSTALL_BASE$GCC_VERSION/lib64/ -name "*.py"` do if [ -n "$PY_FILE" ] && [ -e "$PY_FILE" ];then echo "mv $PY_FILE $INSTALL_BASE$GCC_VERSION" mv $PY_FILE $INSTALL_BASE$GCC_VERSION fi done ldconfig echo 'export PATH=$PATH:'"$INSTALL_BASE$GCC_VERSION/bin" >> /etc/profile source /etc/profile yum remove -y gcc-c++ echo "install gcc-$GCC_VERSION success!"; fi
使用方法:bash
在root帐号下,建立一个.sh后缀的shell脚本文件,好比:gcc-install.sh 并把上面安装代码写入保存。curl
执行安装命令ide
bash gcc-install.sh new
若是系统的依赖过少致使安装不成功,则须要增长对应的依赖包(这里只以测试系统为例依赖包可能安装不是很充足),安装目录能够在安装脚本中去配置修改,安装成功后会提示安装成功文案。工具