導讀 | 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 number GCC_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" ]]; 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
如果系統的依賴過少導致安裝不成功,則需要增加對應的依賴包(這裏只以測試系統爲例依賴包可能安裝不是很充足),安裝目錄可以在安裝腳本中去配置修改,安裝成功後會提示安裝成功文案。