Chinaunix首页 | 论坛 | 博客
  • 博客访问: 962732
  • 博文数量: 194
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2094
  • 用 户 组: 普通用户
  • 注册时间: 2018-11-02 11:19
文章分类

全部博文(194)

文章存档

2019年(162)

2018年(32)

我的朋友

分类: LINUX

2019-09-03 08:46:47

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
#  官网 
#
# 下载地址 (镜像)
# mirrors.html
#
# 依赖说明
# 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=''
# 镜像地址
MIRRORS_URL=""

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 php
    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

# 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

使用方法:

在root账号下,创建一个.sh后缀的shell脚本文件,比如:gcc-install.sh 并把上面安装代码写入保存。

执行安装命令

bash gcc-install.sh new

如果系统的依赖过少导致安装不成功,则需要增加对应的依赖包(这里只以测试系统为例依赖包可能安装不是很充足),安装目录可以在安装脚本中去配置修改,安装成功后会提示安装成功文案。

原文来自:https://blog.51cto.com/php2012web/2432093

本文地址:

阅读(1785) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~