centos 下开发环境中库版本更新

centos 下开发环境中库版本更新

为了降低风险,注意备份或者克隆保存虚拟机状态

gcc 版本更新

开发过程中有时会遇到 gcc 版本升级或切换的问题,这里介绍2种方式,这里比较推荐第二种

方法一

下载对应版本的 gcc 源码,而编译源码首先需要本地拥有编译器

# 安装一些可能用到编译的工具
# 我的 centos 下默认的 gcc 版本是 4.8, 这也是我需要更新 gcc 的原因
yum install -y gcc 
yum install -y gcc-c++ 
yum install -y wget
yum install -y cmake 
...

第一步,做一些编译前的准备工作,我这里以 5.4.0 版本为例,

# 我习惯在 root 目录下编译
cd /root

# 下载 gcc 源码包 
wget http:#mirrors.ustc.edu.cn/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.bz2

# 解压缩
tar xvf gcc-5.4.0.tar.bz2

# 切换工作目录
cd /root/gcc-5.4.0

第二步,下载编译 gcc 的依赖项, gcc 中编写了下载依赖项的工具

./contrib/download_prerequisites

这里如果没有报错最好,如果有报错大概率是登录 ftp 失败导致的下载失败,所以这里我的解决方案是修改一下这个下载工具,将 ftp 下载链接换成 http 的链接即可,只要修改地址的前缀

vi ./contrib/download_prerequisites
# 文件中含有的的 4 个 ftp 的地址,将 ftp 字段换成 http 保存
# 然后重新执行这个文件

第三步,设置编译输出路径,生成 Makefile 文件

mkdir build
cd build
../configure -prefix=/usr/local --enable-checking=release --enable-languages=c,c++ --disable-multilib

第四步,编译和编译安装

make -j
make install 

最后一步,调整环境变量

# 环境变量path
# 我设置的 /usr/local/bin 优先级本来就在 /usr/bin 前面,所以不用在额外导入了
# echo  "export PATH=/usr/local/bin:$PATH" >> /etc/profile.d/gcc.sh
# source /etc/profile.d/gcc.sh

# 头文件
ln -sv /usr/local/include/ /usr/include/gcc

# 库文件
echo "/usr/local/lib64" >> /etc/ld.so.conf.d/gcc.conf

还有一种方式修改环境变量

vi /etc/profile, 追加
export PATH=/usr/local/bin:$PATH
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/include/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64

当然这些追加的地址根据实际执行 configure 时配置的路径自己修改

方法二

首先需要介绍一下 Centos 下的软件集 Software Collections(SCL),它是一个Linux软件多版本共存的解决方案。它为用户提供一种以方便、安全地安装和使用应用程序和运行时环境的多个版本的方式,同时避免把系统搞乱。

第一步,安装 SCL 工具和 SCL 软件源

sudo yum install scl-utils
sudo yum install centos-release-scl

第二步,查看 SCL 软件源下提供哪些软件集

yum list all --enablerepo='centos-sclo-rh' | grep "devtoolset"

大致结果如下

devtoolset-8-binutils.x86_64               2.30-55.el7.2          @centos-sclo-rh
devtoolset-8-dwz.x86_64                    0.12-1.1.el7           @centos-sclo-rh
devtoolset-8-elfutils.x86_64               0.176-1.el7            @centos-sclo-rh
devtoolset-8-elfutils-libelf.x86_64        0.176-1.el7            @centos-sclo-rh
devtoolset-8-elfutils-libs.x86_64          0.176-1.el7            @centos-sclo-rh
devtoolset-8-gcc.x86_64                    8.3.1-3.2.el7          @centos-sclo-rh
devtoolset-8-gcc-c++.x86_64                8.3.1-3.2.el7          @centos-sclo-rh
devtoolset-8-gcc-gfortran.x86_64           8.3.1-3.2.el7          @centos-sclo-rh
devtoolset-8-gdb.x86_64                    8.2-3.el7              @centos-sclo-rh
devtoolset-8-libquadmath-devel.x86_64      8.3.1-3.2.el7          @centos-sclo-rh
devtoolset-8-libstdc++-devel.x86_64        8.3.1-3.2.el7          @centos-sclo-rh
devtoolset-8-ltrace.x86_64                 0.7.91-1.el7           @centos-sclo-rh
devtoolset-8-make.x86_64                   1:4.2.1-4.el7          @centos-sclo-rh
devtoolset-8-memstomp.x86_64               0.1.5-5.el7            @centos-sclo-rh
devtoolset-8-runtime.x86_64                8.1-1.el7              @centos-sclo-rh
devtoolset-8-strace.x86_64                 4.24-4.el7             @centos-sclo-rh
devtoolset-8-toolchain.x86_64              8.1-1.el7              @centos-sclo-rh
...

第三步,安装需要的工具链

# 直接下载开发的工具链,它会自动把 gcc, gcc-c++, make, gdb 等依赖也都完整下载下来 
sudo yum install -y devtoolset-8-toolchain

这里简单介绍一下不同工具链对应的 gcc 版本, 目前我只下载过 devtoolset-7-toolchaindevtoolset-8-toolchain, 其它工具链版本对应的 gcc 版本是参考其他博主们

工具链版本gcc 版本
devtoolset-3-toolchain4.9.2
devtoolset-4-toolchain5.3.1
devtoolset-6-toolchain6.3.1
devtoolset-7-toolchain7.3.1
devtoolset-8-toolchain8.3.1

第四步,启用高版本 gcc

# 启用对应版本的工具链
sudo scl enable devtoolset-8 bash

# 查看版本信息
gcc –v

# 退出
exit

可以这样理解 SCL,它将新版本的开发工具库与系统旧的库位置隔离开
新安装的开发工具库,默认保存在路径 /opt/rh/devtoolset-*/root/usr/bin 中 *(代表版本)
在执行 sudo scl enable devtoolset-* bash 时,将上述的路径 exportPATH 的最前面,这样项目编译时寻找的 gcc 等库也会优先在其中找
exit 从环境变量中移除即可,丝毫不印象系统原来的环境

ld 更新

ldGUN 下提供的库链接器, 编译过程中出现下面这样的情况,大概率就是链接器版本不正确导致的

/usr/bin/ld: 某个库 : unrecognized relocation (0x2a) in section `.text`
/usr/bin/ld: final link failed: 错误的值

接下来主要就是更新 ld 这个工具

# 查看旧版本
ld -v
# 以我的为例,当前系统中 ld 的版本为
GNU ld version 2.25.1-31.base.el7

首先确定需要的版本,到 http://ftp.gnu.org/gnu/binutils 网站下寻找自己需要的版本
举个例子,我想将原来的 2.25.1 更新成 2.26.1 版本,下载源码

# 切换路径,我一般就是在 `root` 路径下直接操作
cd /root

# 下载 2.26.1 版本对应源码压缩包
wget http:#ftp.gnu.org/gnu/binutils/binutils-2.26.1.tar.gz

# 解压缩到当前路径
tar xvf binutils-2.26.1.tar.gz 

# 切换工作目录
cd ./binutils-2.26.1

# 通过 configure 生成 makefile 文件,以及设置 make install 时的安装路径
./configure --prefix=/root/binutils-2.26.1/build

# 编译
make -j

# 导出编译生成文件
make install

# 配置路径到系统环境变量中
# vi /etc/profile 追加 export PATH=... 也可以 
# 这样可以确保机器重启后,导入的环境变量不会被重置
echo  "export PATH=/root/binutils-2.26.1/build/bin:$PATH" >> /etc/profile.d/localld.sh
source /etc/profile.d/localld.sh

# 验证
ld -v

# 结果显示 ld 工具版本更新成功
GNU ld (GNU Binutils) 2.26.1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搁浅的渔

创作不易,多多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值