【Linux开发工具】C/C++ 在Linux下的编译器-gcc/g++
目录
一、前言
二、gcc/g++的使用
三、程序翻译的四个阶段
1.预处理
2.编译
3.汇编
4.链接
四、动静态库
1.库函数的命名和分类
2. 动静态库的区别
一、前言
学习了vim的使用方法后,我们就可以高效编辑文本文件了,但vim并不像vs一样编辑好.c文件后就可以直接编译运行,在Linux中运行代码需要使用工具:gcc/g++
本文着重讲解gcc/g++的使用和程序翻译需要进行的四个阶段:预处理、编译、汇编、链接对应的指令和生成的文件,最后讲解动静态库的区别和联系。
二、gcc/g++的使用
在前面Linux的学习中,我们认识到Linux不区别文件后缀,例如写了.txt后缀能提醒用户这是个文本文件,不写也不影响什么。
但Linux系统不区分文件后缀,不代表Linux下的各种程序不区分!今天学习的gcc和g++就是Linux下的程序,它们是要看文件后缀的!
- gcc是C语言编译器,只能编译C语言程序,也就是.c为后缀的文件
- g++是C++编译器,C、C++都可以编译
接下来介绍gcc/g++的使用方法:以编译code.c文件为例
指令 gcc code.c 默认生成名为a.out的可执行程序
指令 gcc code.c -o name 生成名为name的可执行程序
指令 gcc code.c -std=99 使用c99标准来编译
当我们生成可执行程序后,此文件通常是绿色的,此时只需要./a.out即可运行代码

三、程序翻译的四个阶段
在学习C语言时就了解到程序翻译需要进行的四个阶段及过程,如下图所示:

1.预处理
在预处理阶段要做的工作有:
- 头文件展开
- 去掉注释
- 条件编译
- 宏替换
那么经过这个过程后,还是C语言代码吗?答案是肯定的,该过程只是预处理了一下C语言代码,把一些没必要的内容删除,减少后续工作的工作量,处理后仍然是C语言代码。
使用指令 gcc -E code.c -o test.i 就可以得到预处理后的.i为后缀的文件
打开code.c和code.i文件对比就能发现,注释已经被去掉,头文件也进行了展开。

另外还有一个注意的点,gcc可以在命令行中定义宏,例如指令gcc code.c -o code -D VERSION2=2就相当于在代码中添加一行#define VERSION2 2,-D选项用于指定一个宏。

2.编译
编译阶段主要的工作是将C语言翻译为汇编代码,需要通过-S选项生成.s为后缀的文件。
使用指令:gcc -S code.c -o code.s

3.汇编
汇编阶段是把汇编语言变成二进制的过程,这个过程生成.o为后缀的目标文件,此时虽然已经是二进制文件了但还不是一个可执行文件,获取该阶段的文件,需要用到-c选项。
使用指令:gcc -c code.c -o code.o
4.链接
链接阶段的大致流程是这样的: .o文件 + 系统库 = 可执行程序
在本篇文章的后半段讲完动静态库后详解链接过程。
四、动静态库
1.库函数的命名和分类
我们在写C语言代码时,像printf这种函数并我们自己去实现,然而在stdio.h的头文件中也仅仅只有printf函数的说明,那么该函数的实现在哪里呢?答案是在可执行程序依赖的第三方库里。
使用指令:ldd 可执行程序名 可以查看该C语言程序所依赖的库,是lib64路径下libc.so.6的库

对于库名字的解释:

- Linux下:.so是动态库,.a是静态库
- Windows下:.ddl是动态库,.lib是静态库
现在我们就能理解链接这个过程了,就是将.o文件和动/静态库结合的过程。
2. 动静态库的区别
通俗的来讲,动态库类似于网吧里的电脑,而静态库就类似于自己家里的电脑。
它们的区别是:
- 动态库是共享库,通过函数地址来关联程序
- 静态库是私有库,可以独立运行
动态库是C/C++或其他第三方提供的所有方法的集合,被所有程序以动态链接的方式关联起来;而静态库则是被所有程序以拷贝的形式,将所有代码拷贝至自己的可执行程序中。
说白了静态库就是将所有的代码拷贝到程序中,而动态库则是去寻找需要调用的函数的地址。
- 动态库的优点:形成的可执行程序体积较小,节省资源
- 动态库的缺点:要查找函数地址,稍微慢一点,并且有强依赖性,丢失库程序将无法运行
- 静态库的优点:无视库,可以独立运行,可移植性好
- 静态库的缺点:体积太大,浪费资源
相关文章:
【Linux开发工具】C/C++ 在Linux下的编译器-gcc/g++
目录 一、前言 二、gcc/g的使用 三、程序翻译的四个阶段 1.预处理 2.编译 3.汇编 4.链接 四、动静态库 1.库函数的命名和分类 2. 动静态库的区别 一、前言 学习了vim的使用方法后,我们就可以高效编辑文本文件了,但vim并不像vs一样编辑好.c文件…...
hmi界面:工业设计风格如何识别,有什么应用场景。
一、工业设计风格在 HMI 界面中的视觉特征 (一)简洁的布局 功能分区明确 工业设计风格的 HMI 界面往往将不同的功能模块进行清晰的分区,每个区域都有明确的用途。例如,操作区、显示区、状态区等划分一目了然,用户可以…...
NIO三大组件
文章目录 概述Channel & BufferSelector服务器设计历史演化多线程版设计线程池版设计selector 版设计 概述 NIO的意思是 non-blocking io 非阻塞 IO 。NIO中存在3大组件:Channel 、 Buffer 、Selector Channel & Buffer channel (中文 管道的…...
pytest.fixture
pytest.fixture 是 pytest 测试框架中的一个非常强大的功能,它允许你在测试函数运行前后执行一些设置或清理代码。以下是关于 pytest.fixture 的详细介绍: 一、定义与用途 pytest.fixture 是一个装饰器,用于标记一个函数为 fixture。Fixture 函数中的代码可以在测试函数运…...
MHTML文件如何在前端页面展示
MHTML文件如何在前端页面展示 需求背景: 目前在给证券公司做项目,但是在使用新系统的过程中,甲方还希望之前之前系统的历史记录可以看到。 最初制定的计划是项目组里面做数据的把原系统页面爬取下来,转成图片,直接给…...
学习笔记:在华为云ModelArts上运行MindSpore扩散模型教程
目录 一、背景与目的 二、环境搭建 三、模型原理学习 1. 类定义与初始化 2. 初始卷积层 3. 时间嵌入模块 4. 下采样模块 5. 中间模块 6. 上采样模块 7. 最终卷积层 8. 前向传播 9. 关键点总结 四、代码实现与运行 五、遇到的问题及解决方法 六、总结与展望 教程来源:…...
使用sharding-jdbc实现读写分离
简介 读写分离是一种数据库架构设计的模式,主要用于提高数据库的性能和可扩展性。它将数据库的读取操作和写入操作分离到不同的数据库实例上,从而优化系统的负载和响应速度。 实现前提是需要进行主从复制(数据层面的分离) 实现…...
“图像识别分割算法:解锁视觉智能的关键技术
嘿,各位朋友!今天咱们来聊聊图像识别分割算法。这可是计算机视觉领域里特别厉害的一项技术,简单来说,它能让机器“看懂”图像中的不同部分,并把它们精准地分出来。想象一下,机器不仅能识别出图里有猫还是狗…...
【Go语言快速上手】第二部分:Go语言进阶
文章目录 并发编程goroutine:创建和调度 goroutinechannel:无缓冲 channel、有缓冲 channel、select 语句无缓冲 channel有缓冲 channelselect 语句 sync 包:Mutex、RWMutex、WaitGroup 等同步原语Mutex:互斥锁RWMutex:…...
GRN前沿:GRETA:从多模式单细胞数据推断基因调控网络方法的比较与评价
1.论文原名:Comparison and evaluation of methods to infer gene regulatory networks frommultimodal single-cell data 2.发表日期:20254.12.21 摘要: 细胞通过基因表达调节其功能,由转录因子和其他调节机制的复杂相互作用驱…...
python基础入门:4.4模块与包管理
Python模块与包管理完全指南:构建可维护的代码结构 # 示例项目结构 """ my_package/ ├── __init__.py ├── core/ │ ├── __init__.py │ ├── utils.py │ └── calculator.py ├── data/ │ └── config.json └── tes…...
《XSS跨站脚本攻击》
一、XSS简介 XSS全称(Cross Site Scripting)跨站脚本攻击,为了避免和CSS层叠样式表名称冲突,所以改为了XSS,是最常见的Web应用程序安全漏洞之一,位于OWASP top 10 2013/2017年度分别为第三名和第七名&…...
LC-两数之和、字母异位词分组、最长连续序列、移动零、盛最多水的容器
两数之和 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length; // 获取数组 nums 的长度// 外层循环:遍历数组中的每一个元素 nums[i]for(int i 0; i < n; i) {// 内层循环:从 nums[i] 的下一个元素 nums[j] 开始遍…...
Netty源码解析之线程池的实现(二):创建线程与执行任务
前言 先看下面的代码: public class MyTest {public static void main(String[] args) {//创建NioEventLoopGroupNioEventLoopGroup loopGroup new NioEventLoopGroup(3);System.out.println(Thread.currentThread()"准备执行任务");//执行任务for (in…...
IDEA - 一个启动类多次启动方法
More Run/Debug -> Modify Run Configuration -> modify options -> Allow mutiple instances...
U3D支持webgpu阅读
https://docs.unity3d.com/6000.1/Documentation/Manual/WebGPU-features.html 这里看到已经该有的差不多都有了 WOW VFX更是好东西 https://unity.com/cn/features/visual-effect-graph 这玩意儿化简了纯手搓一个特效的流程 如果按原理说就是compute shader刷position&#…...
C++广度优先搜索
简介 老规矩,先来介绍一下什么是广度优先搜索(至于这么长时间没更新是为什么,我放在文章结尾了,感兴趣可以看看,以后也是如此) 广度优先搜索,从名字就能听出来,他和深度优先搜索关…...
SVN 提交与原有文件类型不一样的文件时的操作
SVN 提交与原有文件类型不一样的文件时的操作 背景 SVN 服务器上原本的文件是软链接类型的,但是我将它改成普通文件再上传。出现了以下提示: 解决过程 本来想着通过 svn rm 和 svn add 来解决,但是行不通。 最终解决方案 svn rm --keep-…...
活动预告 | Power Hour: Copilot 引领商业应用的未来
课程介绍 智能化时代,商业应用如何实现突破?微软全球副总裁 Charles Lamanna 将为您深度解析,剖析其中关键因素。 在本次线上研讨会中,Charles Lamanna 将分享他在增强商业运营方面的独到见解与实战策略,深度解读商业…...
WPF 进度条(ProgressBar)示例一
本文讲述:WPF 进度条(ProgressBar)简单的样式修改和使用。 进度显示界面:使用UserControl把ProgressBar和进度值以及要显示的内容全部组装在UserControl界面中,方便其他界面直接进行使用。 <UserControl x:Class"DefProcessBarDemo…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门  class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
