前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >升级GCC版本到8.3(多GCC版本共存)

升级GCC版本到8.3(多GCC版本共存)

作者头像
fangfang
发布2021-10-29 15:46:40
7.9K3
发布2021-10-29 15:46:40
举报
文章被收录于专栏:方方的杂货铺方方的杂货铺

升级GCC版本到8.3

公司的tlinux2.2自带的是GCC4.8.5(基于CentOS7), 勉强支持C++11, 但目前C++主流社区已经广泛使用C++14, C++17, 老版本的GCC对于新的语言特性的使用是个比较大的障碍, 目前工作室打算在研未上线项目逐步向TencentOS3进行迁移, TencentOS3自带的GCC版本是8.3, 该版本已经比较完整的支持了C++17的特性, 而我们原来的代码大多是基于GCC4.8的, 存在GCC版本混用的情况. 本文主要是针对笔者当前遇到的情况, 介绍怎么升级GCC8.3并同时保留旧版本的GCC4.8.5, 这样可以更好的安排整个过渡阶段的开发节奏, 等所有代码适配GCC8.3后再统一编译环境到GCC8.3.

1. 下载GCC8.3源码(附件中也有)

GCC的源码仓库地址为: https://github.com/gcc-mirror/gcc ,在浏览器打开这个网址后,不要急于下载,先选择gcc的版本,如下图所示:

如上图所示找到GCC8.3, 并点击 "releases/gcc-8.3.0"完成仓库的切换, 进入自己的home目录执行如下命令:

代码语言:javascript
复制
git clone --branch releases/gcc-8.3.0 https://github.com/gcc-mirror/gcc.git

也可以直接在网页上下载zip包, 然后自行上传至服务器后解压, 效果与直接使用git命令一致:

代码语言:javascript
复制
unzip gcc-releases-gcc-8.3.0.zip

获取完成源代码后, 将当前目录切换到GCC源码根目录, 进入下一步. 源码目录如下图所示:

2. 安装依赖库

新的GCC源码内置了依赖库的获取脚本, GCC所依赖的mpfr, gmp, mpc, isl都可以使用内置脚本直接获取, 比老版本简单非常多, 在GCC目录下, 执行:

代码语言:javascript
复制
./contrib/download_prerequisites

此命名会自动下载GCC编译需要的几个依赖库.

3.配置和编译

前文也提到了, 我们需要同时保留老版本的GCC, 所以配置项里需要指定安装的目录, 配置命令如下 :

代码语言:javascript
复制
./configure --prefix=/usr/local/gcc-8.3.0 --enable-bootstrap --enable-languages=c,c++ --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib

我们仅会使用GCC做C与C++的编译, 所以此处语言也仅选择了这两者. 配置完成后, 我们进入编译安装阶段. 此处可以直接打开并行编译执行make命令, 比如笔者机器是24核的, 此处直接将并发数设置为48进行编译, 实测效果不错.

代码语言:javascript
复制
make -j48

漫长的等待后(公司DevCloud24核机器应该是10多分钟), 编译没有错误出现的话, 进入root权限执行安装命令. 记得一定要root权限, 不然可能会因为权限不足安装失败.

代码语言:javascript
复制
sudo -s
make install

这时整个gcc的安装过程已经成功执行完成, 按如下方法测试GCC是否正确安装:

代码语言:javascript
复制
/usr/local/gcc-8.3.0/bin/gcc --version

得到上图的输出, 则GCC8.3已经成功安装. 另外也可以直接gcc --version测试一下gcc 4.8.5的状态.

两者都能够正确的访问.

4. CMake中指定需要的GCC版本

可以直接在shell中对CC和CXX进行指定:

代码语言:javascript
复制
export CC=/usr/local/gcc-8.3.0/bin/gcc
export CXX=/usr/local/gcc-8.3.0/bin/g++
cmake /path/to/your/project
make

也可以直接在cmake的命令行参数中进行指定:

代码语言:javascript
复制
cmake -D CMAKE_C_COMPILER=/usr/local/gcc-8.3.0/bin/gcc -D CMAKE_CXX_COMPILER=/usr/local/gcc-8.3.0/bin/g++

5. 运行GCC8.3

因为我们不是替换安装的方式, 所以运行需要的库默认是没有被添加到系统路径下的, 我们还需要额外的一步操作才能让gcc8.3编译出的程序正常的运行:

代码语言:javascript
复制
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/gcc-8.3.0/lib64

可以直接将本行追加到~/.bashrc, 避免每次都单独写shell脚本追加该项. 注意更改~/.bashrc后记得重新连接终端, 让修改生效.

6. 多GCC版本导致的ABI兼容问题

需要特别注意的是ABI兼容的问题, 有部分库我们可能是直接使用的第三方的, 没有源码, 那么可能对应库依然是使用GCC4.8编译的, 默认开启C++11后GCC会同样更改应用程序的ABI到CX11, 与老的库不兼容, 产生的报错如下图所示:

临时的解决方案是在编译的时候添加宏-D_GLIBCXX_USE_CXX11_ABI=0, 禁止编译器使用新的ABI格式, 这样就能与老的GCC4.8的库共存了. 宏一般直接追加到CMake文件中即可, 如下图所示:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 升级GCC版本到8.3
  • 1. 下载GCC8.3源码(附件中也有)
  • 2. 安装依赖库
  • 3.配置和编译
  • 4. CMake中指定需要的GCC版本
  • 5. 运行GCC8.3
  • 6. 多GCC版本导致的ABI兼容问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档