当前位置: 首页 > news >正文

【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. 关键点总结 四、代码实现与运行 五、遇到的问题及解决方法 六、总结与展望 教程来源&#xff1a…...

使用sharding-jdbc实现读写分离

简介 读写分离是一种数据库架构设计的模式,主要用于提高数据库的性能和可扩展性。它将数据库的读取操作和写入操作分离到不同的数据库实例上,从而优化系统的负载和响应速度。 实现前提是需要进行主从复制(数据层面的分离) 实现…...

“图像识别分割算法:解锁视觉智能的关键技术

嘿,各位朋友!今天咱们来聊聊图像识别分割算法。这可是计算机视觉领域里特别厉害的一项技术,简单来说,它能让机器“看懂”图像中的不同部分,并把它们精准地分出来。想象一下,机器不仅能识别出图里有猫还是狗…...

【Go语言快速上手】第二部分:Go语言进阶

文章目录 并发编程goroutine:创建和调度 goroutinechannel:无缓冲 channel、有缓冲 channel、select 语句无缓冲 channel有缓冲 channelselect 语句 sync 包:Mutex、RWMutex、WaitGroup 等同步原语Mutex:互斥锁RWMutex&#xff1a…...

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 的长度// 外层循环&#xff1a;遍历数组中的每一个元素 nums[i]for(int i 0; i < n; i) {// 内层循环&#xff1a;从 nums[i] 的下一个元素 nums[j] 开始遍…...

Netty源码解析之线程池的实现(二):创建线程与执行任务

前言 先看下面的代码&#xff1a; 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++广度优先搜索

简介 老规矩&#xff0c;先来介绍一下什么是广度优先搜索&#xff08;至于这么长时间没更新是为什么&#xff0c;我放在文章结尾了&#xff0c;感兴趣可以看看&#xff0c;以后也是如此&#xff09; 广度优先搜索&#xff0c;从名字就能听出来&#xff0c;他和深度优先搜索关…...

SVN 提交与原有文件类型不一样的文件时的操作

SVN 提交与原有文件类型不一样的文件时的操作 背景 SVN 服务器上原本的文件是软链接类型的&#xff0c;但是我将它改成普通文件再上传。出现了以下提示&#xff1a; 解决过程 本来想着通过 svn rm 和 svn add 来解决&#xff0c;但是行不通。 最终解决方案 svn rm --keep-…...

活动预告 | Power Hour: Copilot 引领商业应用的未来

课程介绍 智能化时代&#xff0c;商业应用如何实现突破&#xff1f;微软全球副总裁 Charles Lamanna 将为您深度解析&#xff0c;剖析其中关键因素。 在本次线上研讨会中&#xff0c;Charles Lamanna 将分享他在增强商业运营方面的独到见解与实战策略&#xff0c;深度解读商业…...

WPF 进度条(ProgressBar)示例一

本文讲述&#xff1a;WPF 进度条(ProgressBar)简单的样式修改和使用。 进度显示界面&#xff1a;使用UserControl把ProgressBar和进度值以及要显示的内容全部组装在UserControl界面中&#xff0c;方便其他界面直接进行使用。 <UserControl x:Class"DefProcessBarDemo…...

除了阿里云,还有哪些靠谱的身份证实名认证方案?SpringBoot整合横向评测

SpringBoot整合主流身份证实名认证API横向评测&#xff1a;从阿里云到多服务商技术选型指南 当你的应用需要接入身份证实名认证功能时&#xff0c;阿里云可能只是众多选项中的一个起点。作为技术决策者&#xff0c;如何在腾讯云、百度智能云、聚合数据等众多服务商中做出最优选…...

基于WebRTC的P2P文件传输系统:架构设计与实现原理

基于WebRTC的P2P文件传输系统&#xff1a;架构设计与实现原理 【免费下载链接】filepizza :pizza: Peer-to-peer file transfers in your browser 项目地址: https://gitcode.com/GitHub_Trending/fi/filepizza 在当今数字时代&#xff0c;文件传输已成为日常工作和协作…...

拓扑排序别再死记硬背了!用邻接矩阵手搓一个(附C++/C语言单文件实现)

拓扑排序的工程化实现&#xff1a;从邻接矩阵到零依赖代码实战 第一次接触拓扑排序时&#xff0c;我盯着教科书上的算法描述看了半天——"选择一个入度为0的顶点并输出"、"从图中删除该顶点和所有以它为起点的有向边"——这些抽象的描述让我困惑不已。直到…...

11.0592MHz晶振在51单片机串口通信中的优势解析

1. 为什么11.0592MHz晶振成为单片机工程师的首选在嵌入式系统设计中&#xff0c;晶振的选择往往决定了整个系统的稳定性和精度。作为一名从事单片机开发多年的工程师&#xff0c;我发现11.0592MHz的晶振在51单片机项目中出现的频率异常高。这绝非偶然&#xff0c;而是由一系列精…...

ESP32S3-Cam + MPU6050 DMP移植避坑实录:从编译报错到姿态数据稳定输出的完整流程

ESP32S3-Cam与MPU6050 DMP移植实战&#xff1a;从编译报错到稳定姿态解算的全流程解析 当ESP32S3-Cam遇上MPU6050的DMP&#xff08;数字运动处理器&#xff09;功能&#xff0c;本应是物联网项目中实现低成本姿态检测的完美组合。但实际移植过程中&#xff0c;开发者往往会遭遇…...

Mermaid Live Editor:代码驱动图表的革新者,重新定义技术可视化流程

Mermaid Live Editor&#xff1a;代码驱动图表的革新者&#xff0c;重新定义技术可视化流程 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trendin…...

QuickSnap:Blender三维建模效率革命,快速对齐插件让精准建模变得简单

QuickSnap&#xff1a;Blender三维建模效率革命&#xff0c;快速对齐插件让精准建模变得简单 【免费下载链接】quicksnap Blender addon to quickly snap objects/vertices/points to object origins/vertices/points 项目地址: https://gitcode.com/gh_mirrors/qu/quicksnap…...

Android USB串口通信终极指南:智能家居物联网项目实战

Android USB串口通信终极指南&#xff1a;智能家居物联网项目实战 【免费下载链接】usb-serial-for-android Android USB host serial driver library for CDC, FTDI, Arduino and other devices. 项目地址: https://gitcode.com/gh_mirrors/us/usb-serial-for-android …...

保姆级教程:用CST 2023的RLC求解器搞定空心电感仿真(附网格优化技巧)

从零到精通的CST空心电感仿真实战指南&#xff1a;RLC求解器与网格优化全解析 在电磁兼容设计和高频电路开发中&#xff0c;空心电感作为无磁芯干扰的理想元件&#xff0c;其精确建模一直是工程师的痛点。传统手工计算难以应对复杂的高频效应&#xff0c;而商业仿真软件的门槛…...

3步告别桌面混乱:开源免费的NoFences桌面分区管理工具

3步告别桌面混乱&#xff1a;开源免费的NoFences桌面分区管理工具 【免费下载链接】NoFences &#x1f6a7; Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否每天都要在杂乱无章的桌面图标中浪费宝贵时间&#x…...