编译GCC native编译器的几点启示

启示

  • 编译 GCC native compiler按照官方介绍并不难

步骤见后面实践脚本,以及官方编译指南链接


  • GCC编译器编译其它程序组件时,会优先使用自身携带的库,例如,常用的自带库,libgcc_s.so、libstdc++
  • 如果部署环境与编译要求存在比较大的依赖差异,则会诱发兼容性问题
  • 高度推荐容器化部署,使得编译环境与部署环境高度一致
  • 组件依赖会形成类似maven库中的依赖树,组件依赖关系各种编程语言均存在类似关系,而这与具体编程语言无关

  • 在一个环境中使用不同的GCC编译版本,例如,高版本GCC编译器,尽量选择devtooolset-*系列rpm包;但如果devtoolset-*包中对齐的GCC版本并非最后结项版本,则可以选择自行编译GCC native compiler,而这个过程并不难
  • 自行编译GCC native compiler,可以参考devtoolset-*系列的目录结构,和其enable切换环境脚本
  • devtoolset-*早期版本容易对齐GCC结项版本,后期发行版失去维护后,较新的GCC高版本则一般没有对齐

为什么选择高版本编译器

  • 更多的warning、error自动检查

部分warning可以转化成error项,结合静态代码检查工具形成代码开发工具链,以及自动编码规范

  • 更准确的错误定位能力,和错误提示
  • sanitizer检查能力
  • 更优良的代码生成质量
  • 新的语言特性

追求新语言特性的优先级最低,除非是必要、能够提高开发效率的语言特性,在一定程度上可以定死编译器的编译标准,作为编码规范的一部分

使用高版本编译器的兼容性问题

图解GCC高版本编译后的部署问题

GCC编译时优先使用自身携带库

编译器存在自身要求的依赖库

  • 这些依赖库体现为新的特性,或编译器定制化要求
  • 不一致会形成依赖冲突,甚至程序不能运行

推荐部署结构

推荐部署结构

  • 编译环境高度和部署环境一致
  • 通过携带少量对齐库依赖,定制环境变量,达到与要求环境模拟一致,但并不污染其它应用
  • 忽略差异依赖库的差异,依赖部署环境的向前、向后兼容能力,用覆盖测试进行保证

公之下策,实为上策!

下策看似不推荐,但是其实是大家用的比较多,也比较省事的做法。忽略了差异性可能带来的风险,而由功能覆盖测试保证产品的可用性。

但是,由于Linux社区强大的兼容性保证能力,得以很多跨版本编译、部署能够经得住功能覆盖测试

如何分析程序的依赖

  # 注意LD_LIRBRARY_PATH设定为优先编译器相对于的库目录,也就是是devtoolset-* enable脚本所做的ldd /path/to/excutable
  • 由此分析出程序依赖的编译器

困难的三方组件

  • 建议直接源码,或静态库依赖
  • 重新编译三方库,或向能够编译它的第三方获取新的动态库版本

对于,具有第三方依赖的程序,更换编译器的代价会更大点,需要根据实际进行选择。

如果一开始,就可以将编译器标准界定的比较高,相当于从最开始就拥有了良好的开端!

从这里也说明一个问题,获取三方库,如果对方也存在复杂的依赖,三方库编译的编译器版本也是需要进行安全评估的

从使用GCC多版本再议环境变量传参的优劣

根据devtoolset-*组件enable脚本对于环境变量的设定,再次总结环境变量与命令选项在传参上的不同

-环境变量命令选项说明
粒度命令选项仅实施于个体程序
共享共用独用环境变量在有一批程序共享使用时比较便捷
方便自动传递每次传递环境变量一次设置,多次免参传递
  • 尺有所短、寸有所长,在合适的场景使用环境变量传递参数信息非常有利,例如,切换GCC不同的版本

参考

  • 官方编译GCC编译器指南
  • GCC Releases

实操编译native compiler脚本

 cd ~# 建立下载源码目录mkdir gcccurl -O https://mirrors.ustc.edu.cn/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.xztar xf gcc-9.5.0.tar.xz# GCC top-level目录cd gcc-9.5.0# 下载依赖./contrib/download_prerequisites# 创建独立编译目录cd ~/gccmkdir buildcd build# 因为编译native compiler,除了必要定制项,其它直接以来configure自动配置# 参考devtoolset-*中的目录结构~/gcc/gcc-9.5.0/configure --prefix=/opt/gcc/9.5.0/root/usr --mandir=/opt/gcc/9.5.0/root/usr/share/man --infodir=/opt/gcc/9.5.0/root/usr/share/info --disable-multilib --enable-language=c,c++# 并行编译make -j8

–disable-multilib 撇开对于32位的支持,如果不需要的话

参考devtoolset-9的enable文件提供编译环境切换能力

# General environment variables
export PATH=/opt/gcc/9.5.0/root/usr/bin${PATH:+:${PATH}}
export MANPATH=/opt/gcc/9.5.0/root/usr/share/man:${MANPATH}
export INFOPATH=/opt/gcc/9.5.0/root/usr/share/info${INFOPATH:+:${INFOPATH}}
export PCP_DIR=/opt/gcc/9.5.0/root# bz847911 workaround:
# we need to evaluate rpm's installed run-time % { _libdir }, not rpmbuild time
# or else /etc/ld.so.conf.d files?
rpmlibdir=$(rpm --eval "%{_libdir}")
# bz1017604: On 64-bit hosts, we should include also the 32-bit library path.
if [ "$rpmlibdir" != "${rpmlibdir/lib64/}" ]; thenrpmlibdir32=":/opt/gcc/9.5.0/root${rpmlibdir/lib64/lib}"
fi# 库的依赖环境变量
export LD_LIBRARY_PATH=/opt/gcc/9.5.0/root$rpmlibdir$rpmlibdir32${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export LD_LIBRARY_PATH=/opt/gcc/9.5.0/root$rpmlibdir$rpmlibdir32:/opt/gcc/9.5.0/root$rpmlibdir/dyninst$rpmlibdir32/dyninst${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export PKG_CONFIG_PATH=/opt/gcc/9.5.0/root/usr/lib64/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}
  • 切换编译环境,重要的是设置PATH和LD_LIBRARY_PATH两个环境变量

strip瘦身

strip  /path/to/executable_file
  • 主机上新编译的native compiler占用比较大的磁盘空间,例如,cc1 就200多M,可以用strip程序进行瘦身

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2805781.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Sentinel微服务流量治理组件实战上

目录 分布式系统遇到的问题 解决方案 Sentinel 是什么? Sentinel 工作原理 Sentinel 功能和设计理念 流量控制 熔断降级 Sentinel工作主流程 Sentinel快速开始 Sentinel资源保护的方式 基于API实现 SentinelResource注解实现 Spring Cloud Alibaba整合…

职业规划,电气工程师的岗位任职资格

电气工程技术人员主要是指精通电气施工技术,从事与电气产相关研发工作并能够解决实际问题,对相关资源进行最终统筹的人员。一般来说,这类人员主要从事绘制、审核和把关电气图纸的工作,在审核电气图纸的时候,会检查施工…

如何将建筑白模叠加到三维地球上?

​ 通过以下方法可以将建筑白模叠加到三维地球上。 方法/步骤 下载三维地图浏览器 http://www.geosaas.com/download/map3dbrowser.exe,安装完成后桌面上出现”三维地图浏览器“图标。 2、双击桌面图标打开”三维地图浏览器“ 3、点击“建筑白模”菜单&…

Kotlin 基本语法5 继承,接口,枚举,密封

1.继承与重写的Open关键字 open class Product(val name:String ) {fun description() "Product: $name"open fun load() "Nothing .."}class LuxuryProduct:Product("Luxury"){//继承需要调用 父类的主构造函数override fun load(): String {…

为什么要开发相亲类App:掘金蓝海市场

一、市场趋势:相亲交友需求旺盛,移动端成主流 近年来,单身人口数量持续增长,催生了巨大的相亲交友市场。据统计,2022年中国单身人口已达2.4亿,预计2025年将突破2.6亿。同时,移动互联网的普及使…

uniapp_微信小程序自定义顶部导航栏和右侧胶囊对齐(不对齐来打我)

一、想要的效果 思路首先开启自定义导航栏&#xff0c;取消自带的导航栏&#xff0c;然后计算胶囊的高度和标题对齐 二、成品代码 1、首先再你需要居中的代码添加以下style <view class"header":style"{paddingTop:navBarTop px,height:navBarHeight px,…

unity hub (第一部)初学配置

1、安装Unity Hub 2、设置中文 3、安装编辑器 4、新建项目 5、新建完成后进入编辑器 6、 编辑器设置中文 editPreferencesLanguages选择中文

《真象还原》读书笔记——第六章 完善内核

6.1 函数调用约定简介 接下来要使用C语言和汇编的混合编程 6.1.1 调用约定 参数的传递方式参数的传递顺序是调用者保存寄存器环境还是被调用者保存环境。保存的有哪些寄存器。 我们可以将参数保存到栈中 这时候有出现问题&#xff1a; 由谁来负责回收。参数多的情况下&…

【SpringCloudAlibaba系列--nacos配置中心】

Nacos做注册中心以及使用docker部署nacos集群的博客在这&#xff1a; 容器化部署Nacos&#xff1a;从环境准备到启动 容器化nacos部署并实现服务发现(gradle) 使用docker部署nacos分布式集群 下面介绍如何使用nacos做配置中心 首先要进行nacos-config的引入&#xff0c;引入…

线性代数:向量、张量、矩阵和标量

线性代数&#xff1a;向量、张量、矩阵和标量 背景 在线性代数中&#xff0c;向量、张量、矩阵和标量都属于基础概念&#xff0c;特别是最近AI的爆火&#xff0c;向量和张量的概念也越来越普及&#xff0c;本文将介绍下这些基本概念。 1. 标量&#xff08;Scalar&#xff0…

会声会影2024视频编辑软件电脑版本下载

一、功能特点 会声会影是一款功能强大的视频编辑软件&#xff0c;它集合了视频剪辑、特效添加、音频处理、字幕制作等多种功能于一身。具体来说&#xff0c;其特点包括&#xff1a; 会声会影2024安装包下载如下: https://wm.makeding.com/iclk/?zoneid55677 直观易用的操作…

WordPress前端如何使用跟后台一样的Dashicons图标字体?

很多站长都喜欢在站点菜单或其他地方添加一些图标字体&#xff0c;常用的就是添加Font Awesome 图标和阿里巴巴矢量库图标iconfont。其实我们使用的 WordPress 本身就有一套管理员使用的官方图标字体 Dashicons&#xff0c;登录我们站点后台就能看到这些图标字体。那么有没有可…

Dynamo批量将房间名称转换为模型文字

今天呢&#xff0c;我们简单聊聊如何把房间名称&#xff0c;变成模型文字&#xff0c;好在三维中能够看到房间名称。 本来吧&#xff0c;我觉得批量创建模型文字应该是个很简单的事&#xff0c;但是我在Dynamo中搜了下ModelText&#xff0c;发现只有一个在族环境中创建模型文字…

新版Java面试专题视频教程——虚拟机篇②

新版Java面试专题视频教程——虚拟机篇② 3 垃圾收回3.1 简述Java垃圾回收机制&#xff1f;&#xff08;GC是什么&#xff1f;为什么要GC&#xff09;3.2 对象什么时候可以被垃圾器回收3.2.1 引用计数法3.2.2 可达性分析算法 3.3 JVM 垃圾回收算法有哪些&#xff1f;——4种3.3…

EasyRecovery2024永久免费版手机数据恢复软件功能全面介绍

一、功能概述 EasyRecovery手机数据恢复软件是一款专为移动设备设计的数据恢复工具。它能够有效地从智能手机、平板电脑等移动设备中恢复因各种原因丢失的数据&#xff0c;包括但不限于误删除、格式化、系统崩溃、病毒感染等。 EasyRecovery-mac最新版本下载:https://wm.maked…

IT廉连看——C语言——循环语句

IT廉连看——C语言——循环语句 循环语句分为三种&#xff1a; while for do while 一、while循环 我们已经掌握了&#xff0c;if语句&#xff1a; if(条件)语句; 当条件满足的情况下&#xff0c;if语句后的语句执行&#xff0c;否则不执行。 但是这个语句只会执行一次…

源代码管理——码云Gitee

目录 Git安装 Gitee配置SSH 源代码管理常规操作 1.idea配置git 2.常规操作 Git安装 安装Git是进行源代码管理的基本步骤之一。以下是在本地安装Git的通用步骤&#xff0c;适用于Windows系统&#xff1a; 下载Git安装程序: 访问Git官网的下载页面&#xff1a;Git官网下载地…

选择适合你的编程语言

引言 在当今瞬息万变的技术领域中&#xff0c;选择一门合适的编程语言对于个人职业发展和技术成长至关重要。每种语言都拥有独特的设计哲学、应用场景和市场需求&#xff0c;因此&#xff0c;在决定投入时间和精力去学习哪种编程语言时&#xff0c;我们需要综合分析多个因素&a…

Redis(十四)双写一致性工程案例

文章目录 问题概述canal功能安装部署mysql配置canal服务端canal客户端&#xff08;Java程序&#xff09; 问题概述 canal https://github.com/alibaba/canal 功能 数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、倒排索引等)业务 cache 刷新带业务逻辑的增量数据…

爬取数位观察城市数据知识总结

# 抓取数位观察中城市的GDP,公交车数量&#xff0c;户籍人口 # url "https://www.swguancha.com/home/query-city-page" # 1.找数据 # 1.1如果数据在页面源代码里&#xff0c;则访问&#xff0c;在本案例中并没有在源代码中 # 1.2如果数据不在页面源代码里&#xff…