Linux编译器-gcc/g++ 使用
在介绍gcc/g++的使用前我们先了解一下两者的不同 gcc时主要编译c语言,而g++主要编译c++的,但是两者的选项是相同的,因此我们以gcc和c语言为例来讲解。
背景知识
gcc和g++都是编译器其核心作用将文本类文件翻译成二进制可执行
那么其过程是怎样的?
总共有4个阶段 预处理 编译 汇编 链接
预处理(预处理功能主要包括宏定义,文件包含,条件编译,去注释等 )
编译(生成汇编)
汇编(生成可重定位目标二进制文件,它不可被执行,形成.obj文件,只将自己的代码翻译形成二进制文件,但并未引用其他函数)
链接(将自己形成的.obj文件和库文件进行合并,形成可执行程序)
gcc完成的过程
gcc中 -o 选项 可以直接形成可执行程序


因此我们平时在使用gcc时可以直接-o形成可执行程序,下面是gcc将test.c形成可执行程序的过程
预处理
在这个阶段预处理功能包括宏定义,文件包含,条件编译,去注释等
预处理指令是以#号开头的代码行
这里我们需要用到 -E 这个选项它作用是让 gcc 在预处理结束后停止编译过程

将test.c预处理完的代码放入myfile.i文件中

可以看到源代码突然增加了很多,我们可以看到上图中预处理完后的myfile.i文件的大小明显变大了
编译(生成汇编)
gcc 先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查
无误后,gcc 把代码翻译成汇编语言。
-S选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

将myfile.s打开可以看到汇编语言

汇编
汇编阶段将编译阶段生成的“.s”文件转成目标文件
使用选项“-c”将汇编代码转化为“.o”的二进制目标代码,生成机器可识别的代码

打开myfile.o

连接(生成可执行文件或库文件)
在成功编译之后,就进入了链接阶段

库函数
接下来我们要讲一个概念函数库
为何可以在linux下进行c c++的编写,因为我们学会了语言,使用printf等函数,那么printf函数是谁实现的呢,答案是库函数实现,在我们开始写c语言时第一句就是包含“stdio.h”来使用printf。
而函数库一般分为静态库和动态库两种
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,生成的文件比较大,但在运行时不再需要库文件。Linux下其后缀名一般为“.a” windows下“.lib”
动态库在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时
链接文件加载库,这样可以节省系统的开销。Linux动态后缀名为“.so”windows下".dll"
总结:
1.库分为静态库(专门让编译器,对用户的程序进行静态链接的)和动态库(专门让编译器, 对用户的程序进行动态链接的)
2.静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我所需要的代码到我自己的可执行程序中
3.动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中的我所需要的代码的地址到我自己的可执行程序中相关的位置
4.静态链接成功后我们的程序,不依赖任何库,可以独立运行
5.动态链接成功后我们的程序,还是依赖动态库, 动态库缺失,我们的程序便无法运行
6.静态库因为自身拷贝,比较浪费空间
7.动态库可以被大家一起使用,实现都在库中,程序内只有地址,节省空间
那么我们如何进行静态链接,使用 -static

一般的云服务器默认只有动态库,在链接静态库时会报错
例如:

可以通过安装c/c++静态库解决。
yum install -y glibc-static
yum install glibc-static libstdc+±static -y
相关文章:
Linux编译器-gcc/g++ 使用
在介绍gcc/g的使用前我们先了解一下两者的不同 gcc时主要编译c语言,而g主要编译c的,但是两者的选项是相同的,因此我们以gcc和c语言为例来讲解。背景知识 gcc和g都是编译器其核心作用将文本类文件翻译成二进制可执行 那么其过程是怎样的&…...
网络安全专家最爱用的9大工具
网络安全专家,不是你认为的那种搞破坏的 “黑客”。网络安全专家,即 “ethical hackers”,是一群专门模拟网络安全专家攻击,帮助客户了解自己网络的弱点,并为客户提出改进建议的网络安全专家。 网络安全专家在工作中&a…...
Linux内核设计与实现第四章学习笔记
文章目录Linux内核设计与实现第四章学习笔记具体场景Linux调度算法传统的调度公平调度调度的实现时间记账调度器实体虚拟实时进程选择调度器入口睡眠和唤醒抢占和上下文切换用户抢占内核抢占实时调度策略Linux内核设计与实现第四章学习笔记 进程优先级:Linux中采用…...
i.MX9352——介绍一款多核异构开发板
本篇来介绍一款多核异构的Linux开发板——OK-MX9352-C开发板。 1 开发板硬件介绍 OK-MX9352-C开发板由核心板和底板组成,核心板采用处理器芯片为NXP的i.MX9352,这是一款多核异构的芯片,核心板基础配置如下 CPU:2Cortex-A551.5G…...
【Python】一文学会面向对象?当然可以的
文章目录前言一、万物皆对象二、类也是对象三,元类总结前言 在大家学习python的时候,一定听说过一句话: 在我们python中万物皆对象,不管是整数、字符串、列表、字典这些基本数据类型,还是函数、以及自定义类创建出来…...
ElasticSearch - SpringBoot整合ES:精确值查询 term
文章目录00. 数据准备01. ElasticSearch 结构化搜索是什么?02. ElasticSearch 结构化搜索方式有哪些?03. ElasticSearch 全文搜索方式有哪些?04. ElasticSearch term 查询数字?05. ElasticSearch term 查询会不会计算评分…...
【GPT4】微软对 GPT-4 的全面测试报告(2)
欢迎关注【youcans的GPT学习笔记】原创作品,火热更新中 微软对 GPT-4 的全面测试报告(1) 微软对 GPT-4 的全面测试报告(2) 【GPT4】微软对 GPT-4 的全面测试报告(2)2. 多模态与跨学科的组合&…...
Docker打包exe运行环境
Docker打包exe运行环境 本文运行环境 Window安装Docker环境 修改配置 点击Switch to Window containers OS/Arch 变为 windows/amd64 拉取window镜像 访问Nano Server找到需要的Window版本拉取镜像 运行镜像测试 进入到容器内部 其他内容就自由发挥啦~~ 参考内容…...
springboot+vue田径运动会成绩管理系统java
springboot是基于spring的快速开发框架, 相比于原生的spring而言, 它通过大量的java config来避免了大量的xml文件, 只需要简单的生成器便能生成一个可以运行的javaweb项目, 是目前最火热的java开发框架 田径运动会成绩管理系统,主要的模块包括首页、个人中心、赛…...
我能“C”——详解操作符(上)
目录 1.操作符的分类: 2. 算数操作符 3.移位操作符 4.位操作符 5.赋值操作符 6.单目操作符 7.关系操作符 8.逻辑操作符 THE END 1.操作符的分类: 操作符也叫运算符 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑…...
第一章Vue基础
文章目录前端发展史前端三要素JavaScript框架UI框架JavaScript构建工具三端合一什么是VueVue的好处什么是MVVM为什么要使用MVVM环境配置第一个Vue程序声明式渲染模板语法绑定样式数据绑定为什么要实现数据的双向绑定el与data的两种写法条件渲染事件驱动事件的基本用法事件修饰符…...
【虚幻引擎UE】UE5核心效率插件推荐
一、UnrealEditorPythonScripts (基于UE5 的Python支持插件) 支持Python语言基于UE5进行开发 GIT地址:https://github.com/mamoniem/UnrealEditorPythonScripts 二、Haxe-UnrealEngine5 (基于UE5 的Haxe支持插件) Haxe是一门新兴的开源编程语言,是一种开源的编程语言。…...
记录丨阿里云校招生的成长经历
为了帮助大家更好地了解阿里云云原生应用平台团队同学的成长路径,我们采访了6位各个时间点加入阿里云的学长学姐们,希望他们的经历可以帮助到大家。 经历分享 钰诚丨2022年加入阿里云,校招 大家好,我叫钰诚,目前刚来…...
蓝桥杯第14天(Python版)
并查集的使用# 并查集模板 N400 fa[] def init(): # 初始化,默认自身为根接点for i in range(N):fa.append(i)def merge(x,y): # 发现可以合并,默认选x的根节点为根接点fa[find(x)]find(y)def find(x): # 相等就是根结点,不然就递归查找根…...
双指针常用方法
1.双指针介绍 双指针是解题时一种常见的思路,一般有两种用法。 1)两个指针反方向,分别从数组开头和结尾开始移动,例如对有序数组的搜索。 2)两个指针同方向移动,例如快慢指针,都是从数组开头…...
人工智能大模型之ChatGPT原理解析
前言 近几个月ChatGPT爆火出圈,一路狂飙;它功能十分强大,不仅能回答各种各样的问题,还可以信写作,给程序找bug…我经过一段时间的深度使用后,十分汗颜,"智障对话"体验相比,…...
傅里叶谱方法-傅里叶谱方法的原理、快速傅里叶变换及其Matlab程序实现
第 3 章 傅里叶谱方法 本章介绍的求解偏微分方程(组)的方法都包含着周期性边界条件, 尽管周期性边界条件不属于数学物理方法中常见的传统三类边界条件, 但它并不脱离实际。某些科学问题的研究重点不受边界的影响, 如孤子之间的相互作用 (非线性薛定谔方程或 K d V \mathrm{…...
11万字数字政府智慧政务大数据建设平台(大数据底座、数据治理)
本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。部分资料内容: 一.1.1 数据采集子系统 数据采集需要实现对全区各委办单位的数据采集功能,包括离线采集、准实时采集和实时采集的采集方式,根…...
Node.js学习笔记——Node.js模块化
一、介绍 1.1.什么是模块化与模板? 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为模块化。 其中拆分出的每个文件就是一个模块,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块…...
【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(12)
目录 写在前面: 题目:P1746 离开中山路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述: 输入格式: 输出格式: 输入样例: 输出样例: 解题思路: 代码: …...
【ZGC性能调优终极指南】:20年JVM专家亲授5大实战瓶颈突破法
第一章:ZGC核心机制与性能边界全景透视ZGC(Z Garbage Collector)是JDK 11引入的低延迟垃圾收集器,专为处理TB级堆内存与毫秒级停顿目标而设计。其核心突破在于并发标记、并发重定位与着色指针(Colored Pointers&#x…...
PyTorch 3.0静态图分布式训练实战指南:从模型切分、通信压缩到GPU显存零冗余,7步上线千卡集群
第一章:PyTorch 3.0静态图分布式训练的演进逻辑与企业级定位PyTorch 3.0并非官方已发布的版本号(截至2024年,PyTorch最新稳定版为2.3),但该命名在此语境中特指工业界对“具备生产就绪型静态图能力与原生分布式协同范式…...
如何让Apple Touch Bar在Windows完美运行?DFRDisplayKm驱动全攻略
如何让Apple Touch Bar在Windows完美运行?DFRDisplayKm驱动全攻略 【免费下载链接】DFRDisplayKm Windows infrastructure support for Apple DFR (Touch Bar) 项目地址: https://gitcode.com/gh_mirrors/df/DFRDisplayKm Apple Touch Bar作为MacBook Pro的特…...
解决Gradio share=True报错:手动下载并配置frpc_linux_amd64_v0.3文件的保姆级教程
解决Gradio shareTrue报错的完整实战指南:从手动配置frpc到深度优化 当你兴奋地准备向客户展示刚完成的Gradio应用时,却在终端看到红色的报错信息——shareTrue参数失效了。这种场景对开发者来说再熟悉不过:本地调试一切正常,但需…...
多品种小批量时代的排产革命:JVS-APS智能排产突破交付周期瓶颈
"紧急订单插入,全产线排程推倒重来"、"设备冲突、物料短缺让排产计划沦为纸上谈兵"、"明明产能充足,订单交付周期却比同行长30%"——这些困境正在困扰着越来越多的制造企业。在现代制造业中,多品种小批量生产模…...
SpringBoot + MongoDB 5分钟快速集成:从0到1实操指南
目录 MongoDB 快速集成 常用API MongoDB MongoDB 是一个基于分布式文件存储的文档型数据库,属于 NoSQL 数据库中最接近关系型数据库的产品,旨在为 Web 应用提供高性能、高可用和可扩展的数据存储解决方案 。 MongoDB以灵活的无模式文档模型…...
ComfyUI ControlNet模型与预处理器搭配秘籍:提升AI绘画精度的关键技巧
ComfyUI ControlNet模型与预处理器搭配秘籍:提升AI绘画精度的关键技巧 在AI绘画领域,ControlNet已经成为精细控制图像生成的重要工具。对于已经熟悉ComfyUI基础操作的用户来说,掌握ControlNet模型与预处理器的搭配技巧,是突破创作…...
避坑指南:nRF52840蓝牙DFU配置中那些官方文档没细说的‘坑’(基于SDK 17.1.0)
nRF52840蓝牙DFU实战避坑手册:从原理到解决方案的深度解析 在嵌入式开发领域,无线固件升级(DFU)功能已成为蓝牙产品的标配需求。nRF52840作为Nordic Semiconductor的旗舰级蓝牙SoC,配合其完善的SDK支持,理论上应该能够轻松实现这一…...
如何用Python免费下载B站4K大会员视频:bilibili-downloader完整指南
如何用Python免费下载B站4K大会员视频:bilibili-downloader完整指南 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为…...
STM32串口通信实战指南与常见问题解析
1. 串口通信基础概念解析串口通信作为嵌入式系统中最基础也最常用的通信方式之一,其核心原理是通过单根数据线按位顺序传输数据。与并行通信相比,虽然传输速率较低,但具有布线简单、成本低廉、传输距离远等显著优势。在实际工程应用中&#x…...
