当前位置:网站首页>一键安装gcc脚本
一键安装gcc脚本
2022-06-26 14:52:00 【波哥】
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如果系统的依赖过少导致安装不成功,则需要增加对应的依赖包(这里只以测试系统为例依赖包可能安装不是很充足),安装目录可以在安装脚本中去配置修改,安装成功后会提示安装成功文案。
边栏推荐
- 信息学奥赛一本通 1405:质数的和与积 (思维题)
- 人力资源导出数据 excel VBA
- SAP gui 770 下载
- 【云原生】 ”人人皆可“ 编程的无代码 iVX 编辑器
- Redis事务与watch指令
- Pytorch深度学习代码技巧
- Informatics Olympiad all in one 1400: count the number of words (string matching)
- 券商经理给的开户二维码安全吗?找谁可以开户啊?
- Mark一下 Unity3d在Inspector中选中不了资源即Project锁定问题
- It's natural for the landlord to take the rent to repay the mortgage
猜你喜欢

Keil4打开单片机工程一片空白,cpu100%程序卡死的问题解决

MySQL master-slave replication and read-write separation

Where do people get their top energy?
![[solo π] ADB connects multiple mobile phones](/img/44/4bd88725434fb67c9237645f024071.png)
[solo π] ADB connects multiple mobile phones

TS常用数据类型总结

Minister of investment of Indonesia: Hon Hai is considering establishing electric bus system and urban Internet of things in its new capital

乐鑫 AWS IoT ExpressLink 模组达到通用可用性

人力资源导出数据 excel VBA

权威发布 | 延安大学2022年教师岗位招聘公告

印尼投资部长:鸿海考虑在其新首都建立电动公交系统、城市物联网
随机推荐
15 bs对象.节点名称.节点名称.string 获取嵌套节点内容
Redis cluster messages
Go变量的声明与赋值
赠书 | 《认知控制》:我们的大脑如何完成任务?
vue中缓存页面 keepAlive使用
The engine "node" is inconsistent with this module
TCP拥塞控制详解 | 1. 概述
Is it safe to open an online stock account? Somebody give me an answer
MHA high availability coordination and failover
clustermeet
R language GLM function logistic regression model, using epidisplay package logistic The display function obtains the summary statistical information of the model (initial and adjusted odds ratio and
Use abp Zero builds a third-party login module (II): server development
R language uses GLM function to build Poisson logarithm linear regression model, processes three-dimensional contingency table data to build saturation model, uses step function to realize stepwise re
Is the account opening link given by the broker manager safe? Who can I open an account with?
feil_uVission4左侧工目录消失
The JVM outputs GC logs, causing the JVM to get stuck. I am stupid
Optimizing for vectorization
Redis-集群
Deployment of kubernetes' controller
Datasets dataset class (2)