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

news2024/9/23 15:28:24

启示

  • 编译 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 gcc
 curl -O https://mirrors.ustc.edu.cn/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.xz
 tar xf gcc-9.5.0.tar.xz
 
 # GCC top-level目录
 cd gcc-9.5.0
 # 下载依赖
 ./contrib/download_prerequisites

 # 创建独立编译目录
  cd ~/gcc
  mkdir build
  cd 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/}" ]; then
 rpmlibdir32=":/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://www.coloradmin.cn/o/1467881.html

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

相关文章

思维导图教你如何学会计算机组成原理

02 给你一张知识地图,计算机组成原理应该这么学 了解了现代计算机的基本硬件组成和背后最基本的冯诺依曼体系结构,我们就可以正式进入计算机组成原理的学习了。在学习一个一个零散的知识点之前,我整理了一份学习地图,好让你对将要…

目标跟踪之KCF详解

High-Speed Tracking with Kernelized Correlation Filters 使用内核化相关滤波器进行高速跟踪 大多数现代跟踪器的核心组件是判别分类器,其任务是区分目标和周围环境。为了应对自然图像变化,此分类器通常使用平移和缩放的样本补丁进行训练。此类样本集…

第三篇:CamX日志打印系统

第三篇:CamX日志打印系统 高通camx的日志主要分2大模块,UMD (user mode driver) 和KMD( kerner mode driver),也就是用户层和kernel层日志。 下面就来看下这2大块日志debug的时候该如何设置? 一、UDM日志 高通camx camera debug日志格式如下: CamX: [][] : . 例子:Ca…

【C++】类与对象—— 初始化列表 、static 静态成员、

类与对象 1 再谈构造函数1.1 构造函数体赋值1.2 初始化列表语法:建议:初始化顺序:注意: 1.3 explicit关键字 2 static 静态成员2.1 概念2.2 声明成员变量2.3 使用类的静态成员2.4 定义静态成员总结 Thanks♪(・ω&#…

提高自定义词汇表上的 RAG 性能

原文地址:improve-rag-performance-on-custom-vocabulary Code:Improve RAG performance on custom vocabulary.ipynb 2024 年 2 月 9 日 糟糕的检索系统会导致混乱、沮丧和幻觉。 新的嵌入模型比以往更加强大。我们根据 MTEB 等基准对其进行了全面评…

go 1.18 不同目录package引用问题

go 1.18开始使用module了 不同的package在vs code中引用的话 需要先开启 是Go1.11版本之后 推出的版本管理工具 有点类似java的 maven工具 可以引入依赖使用 go env -w GO111MODULEon 先把这个打开 然后在创建的vs code工作目录下 执行 module gomdoule module 模块名 会生…

前后端分离Vue+nodejs校园论坛bbs系统x450z

开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode本论文拟采用计算机技术设计并开发的论坛bbs系统,主要是为用户提供服务。使得用户可以在系统上查看帖子信息、签到积分等…

unity hub (第一部)初学配置

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

数学建模资料分享

1. 往年各赛题的优秀论文 可以用来参考一下论文是怎么写的。参考论文的结构,格式,思路等等。 链接:https://pan.baidu.com/s/1WG2t4-x9MjtaSgkq4ue5AQ?pwdnlzx 提取码:nlzx --来自百度网盘超级会员V4的分享 2.论文模板 链接&a…

学习JAVA的第二天(基础)

目录 基本概念 关键字 class关键字 字面量 练习 变量 定义格式 变量使用 数据类型 基本数据类型 标识符 命名规则 键盘录入 1.导包 2.创建对象 3.接受数据 运算符 算术运算符 练习 隐式转换(自动类型提升) 强制转换 自增自减运算符 …

众安保险基于Apache SeaTunnel的生产应用实践

*> 文|曾力 众安保险大数据开发高级专家 编辑整理| 曾辉* 前言 众安保险从2023年4月就开始了数据集成服务的预研工作,意在通过该服务解决当前数据同步场景下的两大痛点,服务化能力薄弱和无分布式同步能力。我们对多种开源数据…

【Java程序设计】【C00291】基于Springboot的网上图书商城(有论文)

基于Springboot的网上图书商城(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的网上图书商城 本系统分为系统功能模块、管理员功能模块以及卖家功能模块。 系统功能模块:在系统首页可以查看首页、图书…

社区志愿者齐心协力,为社区居民营造温馨和谐环境

近日,在我们的社区里,一场温暖而有力的力量正在悄然兴起。一群热心居民自发组织成为社区志愿者团队,积极投身于服务社区的各项活动中,为居民们营造了一个温馨和谐的生活环境。 在每个周末的清晨,志愿者们早早地聚集在社…

匿名+有名管道

管道 相关概念 4种情况 正常情况,如果管道没有数据,读端陷入等待,直到有数据才能唤醒正常情况,如果管道被写满,写端陷入等待,直到有空间才能唤醒写段关闭,读端一直读取,read返回0…

Linux Android USB gadget(从设备驱动)

Linux Android USB gadget 一:Linux usb gadget 与 Android Composite Gadget二:原生方式和Android方式如何配置函数调用逻辑内核配置原生驱动android驱动三:mass_storage配置虚拟化U盘四:遍历usb设备五:adb usb判断usb设备为adb获取adb配置信息adb设备序列号发送与接收《Linux…

一键生成PDF即刻呈现:轻松创建无忧体验

在信息爆炸的时代,我们每天都在与各种文件、资料打交道。无论是工作中的报告、合同,还是学习中的笔记、论文,如何高效、安全地管理这些珍贵的资料,成为了我们迫切的需求。幸运的是,随着科技的发展,我们不再…

在Linux系统上实现高效安装与部署环境的全方位指南

前言 在数字化时代,Linux操作系统以其高度的灵活性、安全性和稳定性,成为了众多开发者和系统管理员的首选。然而,要想充分发挥Linux系统的优势,一个高效、稳定、易于管理的安装与部署环境至关重要。本文旨在为广大Linux爱好者、初…

XSS原理和攻防

Cross Site Scripting:跨站脚本攻击 用户提交的数据中可以构造恶意代码,并且执行,从而实现窃取用户信息等攻击 攻击: 防御: 1.对输入进行过滤,对输出进行编码 2.cookie设置http-only

计算机网络面经_体系结构一文说清

编辑:平平无奇的羊 目录 基础 1. 计算机网络结构体系 三种模型之间的区别: 如何背诵: 进阶 OSI七层模型: TCP/IP四层模型: TCP/IP五层模型 总结 字节实习生为大家带来的是计算机网络面经系列博文,由浅…

【Flink集群RPC通讯机制(二)】创建AkkaRpcService、启动RPC服务、实现相互通信

文章目录 零. RpcService服务概述1. AkkaRpcService的创建和初始化2.通过AkkaRpcService初始化RpcServer3. ResourceManager中RPC服务的启动4. 实现相互通讯能力 零. RpcService服务概述 RpcService负责创建和启动Flink集群环境中RpcEndpoint组件的RpcServer,且Rpc…