gcc与g++的原理

程序的翻译

  • 1 快速认识gcc/g++
  • 2 程序翻译的过程
    • 2.1 预处理阶段
    • 2.2 编译阶段
    • 2.3 汇编阶段
    • 2.4 链接阶段
  • 3 动静态库

1 快速认识gcc/g++

首先我们需要在linux系统中安装对应的编译器gcc/g++,安装命令如下(centos7环境下):

gcc: yum install gcc
g++: yum install gcc-c++

直接说明结论吧,gcc既可以编译C语言代码,又可以编译cpp代码,但是g++只能编译cpp代码!这个可以分别写一个cpp代码与c代码,用这两个编译器进行编译!我们就以gcc来说明程序翻译的过程(g++的原理也是类似的)!

2 程序翻译的过程

2.1 预处理阶段

预处理阶段所要做的工作就是头文件展开,去注释,宏替换,条件编译

头文件展开就是将头文件中的内容拷贝到源文件中,去注释就是把相应注释去除掉
,有宏定义的变量要把它替换掉,这里主要就是说下条件编译,就是编译满足条件的内容!下面我来举个简单的例子来说明一下什么事条件编译吧!首先我们在Linux中建立一个C语言文件,命名为test1.c。内容如下所示:

  5 #include <stdio.h>                            6 int main(){                  7  #ifdef version1             8     printf("version1");      9  #elif version2              10     printf("version2");      11  #else                       12     printf("free version");  13  #endif                      14   return 0;                  15 }                            
~     

我们使用以下命令就可以实现条件编译了

gcc test1.c -D version2

此时我们利用条件编译就可以打印出version2了,了解这个条件的编译的目的就是为了让我们知道,我们可以通过给编译器传递不同的宏值,从而实现我们代码的动态裁剪。以及有些软件分为社区版与专业版本质就是利用了条件编译!
在大概了解完预处理阶段要做的事情,我们在linux中也可以使用命令来才看经过预处理之后的代码!在Linux中建立了一个test.c文件,使用如下命令:

gcc -E(完成预处理工作就行) test.c -o(取别名) test.i

在预处理阶段之后,实际上是会生成一个以点i结尾的文件,所以这里就对test.c经过预处理之后取了一个别名test.i

2.2 编译阶段

程序编译阶段实际上就是把我们的C语言代码翻译成汇编代码,生成一个以点s结尾的文件

命令:gcc -S(完成编译阶段) test.i -o test.s

2.3 汇编阶段

汇编阶段就是把我们的汇编代码翻译成二进制!生成一个以点o结尾的文件

命令:gcc -c (完成汇编阶段,注意这里c是小写)test.s -o test.o

2.4 链接阶段

链接阶段就是将我们生成以点o结尾的文件与库里面的对应的点o文件相链接,只要我们使用了库中的函数如:printf,scanf等。

3 动静态库

在Windows下,动态库是以dll为结尾的文件,静态库是以lib结尾的文件!而在Linux系统下,动态库是以so结尾的文件,静态库是以a结尾的文件!本节中,我们简单的先了解一下什么是动态库,什么是静态库!

首先我们先来理解一下什么是动态库吧,以下图为例!
在这里插入图片描述
首先我们的代码片段会加载到内存中,生成以点o结尾的文件之后,根据代码就会知道动态库的地址,从而在动态库的文件中找对应的点o文件进行链接,这种链接方式就叫做动态链接!所以静态库就是程序会知道静态库的地址,然后将所需的库文件从静态库拷贝一份到源文件中!这种方式就叫做静态链接!我们需要注意的是动态库与静态库还是有区别的,至于具体的区别是什么,在之后的学习过程中,我们还要进一步的进行学习!在了解完什么是静态链接与动态链接之后,在Linux系统下,默认的就是动态链接,如下图所示:

动态链接编译:gcc test.c -o test.exe

在这里插入图片描述

ldd命令就可以查看文件所依赖的库文件,file命令就可以查看文件的链接属性了

我们如果想要进行静态链接,就必须先在Linux环境中安装静态库!命令如下所示:

sudo yum install -y glibc-static

如下图所示,就是静态链接的查看

静态链接的编译:gcc test.c -o test-static.exe -static

在这里插入图片描述
我们再来看下动静态库的区别

在这里插入图片描述
我们可以发现,动态库的优点就是节省资源(网络,内存等),不会有过多的重复代码!缺点就是对库的依赖性很高,要是库文件没用,那么程序无法运行!静态库的优缺点正好与动态库是相反的!
总结一下,程序的翻译过程就可以用下面这张图来形象的进行概括!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法金 | 不愧是腾讯,问基础巨细节 。。。

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 最近&#xff0c;有读者参加了腾讯算法岗位的面试&#xff0c;面试着重考察了基础知识&#xff0c;并且提问非常详细。 特别是关于Ada…

GIGE 协议摘录 —— GVCP 协议(二)

系列文章目录 GIGE 学习笔记 GIGE 协议摘录 —— 设备发现&#xff08;一&#xff09; GIGE 协议摘录 —— GVCP 协议&#xff08;二&#xff09; GIGE 协议摘录 —— GVSP 协议&#xff08;三&#xff09; GIGE 协议摘录 —— 引导寄存器&#xff08;四&#xff09; GIGE 协议…

抢人!抢人!抢人! IT行业某岗位已经开始抢人了!

所谓抢滩鸿蒙&#xff0c;人才先行。鸿蒙系统火力全开后&#xff0c;抢人已成鸿蒙市场的主题词&#xff01; 智联招聘数据显示&#xff0c;春节后首周&#xff0c;鸿蒙相关职位数同比增长163%&#xff0c;是去年同期的2.6倍&#xff0c;2023年9-12月鸿蒙相关职位数同比增速为3…

Oracle EBS AP发票验证-计税期间出现意外错误解决方法

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: **打开发票题头或发票行“税详细信息”**错误提示如下: 由于以下原因而无法针对"税"窗口中所做的修改更新 Oraclee Payables信息: 尚未为税率或帐户来源税率设置可退回税/应纳税额帐户。请…

Mac下载Homebrew

通过command空格搜索终端打开 直接输入 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 然后输入电脑密码 然后直接回车等待安装完成 注意⚠️&#xff1a;如果出现报错/opt/homebrew/bin is not in your PATH…

yum进阶——配置yum源

一、yum概述 yum的主要作用 解决依赖关系 自动安装 自动升级 各个系统中的安装软件服务 CentOS7 &#xff1a;yum -y 安装 rpm包 CentOS8 &#xff1a;dnf&#xff08;yum的升级版&#xff09;&#xff0c; Ubantu(22.04) &#xff1a;apt -y 安装&#xff0c;安装源为/…

民主测评要做些什么?

民主测评&#xff0c;作为一种重要的民主管理工具&#xff0c;旨在通过广泛征求群众意见&#xff0c;对特定对象或事项进行客观、公正的评价。它不仅是推动民主参与、民主监督的重要手段&#xff0c;也是提升治理效能、促进社会和谐的有效途径。以下将详细介绍民主测评的主要过…

GNU Radio实现OFDM Radar

文章目录 前言一、GNU Radio Radar Toolbox编译及安装二、ofdm radar 原理讲解三、GNU Radio 实现 OFDM Radar1、官方提供的 grc①、grc 图②、运行结果 2、修改后的便于后续可实现探测和通信的 grc①、grc 图②、运行结果 四、资源自取 前言 本文使用 GNU Radio 搭建 OFDM Ra…

分水岭算法分割和霍夫变换识别图像中的硬币

首先解释一下第一种分水岭算法&#xff1a; 一、分水岭算法 分水岭算法是一种基于拓扑学的图像分割技术&#xff0c;广泛应用于图像处理和计算机视觉领域。它将图像视为一个拓扑表面&#xff0c;其中亮度值代表高度。算法的目标是通过模拟雨水从山顶流到山谷的过程&#xff0…

代码解读 | Hybrid Transformers for Music Source Separation[03]

一、背景 接着上一篇代码解读 | Hybrid Transformers for Music Source Separation[02]文章&#xff0c;继续对Hybrid Transformer Demucs 代码进行解读。 解读目标&#xff1a;明确数据从进入算法&#xff0c;在算法内部&#xff0c;以及在算法输出 这三个阶段中 数据的大小是…

如何执行VMware P2V迁移|VMware Converter和替代方案

VMware中的P2V是什么&#xff1f; 我们常说的VMware P2V其实指的就是“物理到虚拟”&#xff0c;将工作负载从物理机器转换或迁移到虚拟机&#xff08;VM&#xff09;的过程&#xff0c;能够使您无需从头开始费力地创建和配置新虚拟机。 就像您可以使用Disk2vhd执行Hyper-V物理…

如何在virtualbox上安装Linux系统(centerOS)

提示&#xff1a;共同学习 注意&#xff1a;一定要在BIOS中的虚拟化打开。 文章目录 第一步&#xff1a; 第一步&#xff1a; 启动 、显示开启 centos基础安装 ​ ​

九大微服务监控工具详解

Prometheus Prometheus 是一个开源的系统监控、和报警工具包&#xff0c;Prometheus 被设计用来监控“微服务架构”。 主要解决&#xff1a; 监控和告警&#xff1a;Prometheus 可以对系统、和应用程序进行实时监控&#xff0c;并在出现问题时发送告警&#xff1b;数据收集和…

超详细的java Comparable,Comparator接口解析

前言 Hello大家好呀&#xff0c;在java中我们常常涉及到对象的比较&#xff0c;不同于基本数据类型&#xff0c;对于我们的自定义对象&#xff0c;需要我们自己去建立比较标准&#xff0c;例如我们自定义一个People类&#xff0c;这个类有name和age两个属性&#xff0c;那么问…

Bev 车道标注方案及复杂车道线解决

文章目录 1. 数据采集方案1.1 传感器方案1.2 数据同步2. 标注方案2.1 标注注意项2.2 4d 标注(时序)2.2.1 4d标签制作2.2.2 时序融合的作用2.2.2.1 时序融合方式2.2.2.2 时序融合难点2.2.2.2 时序实际应用情况3. 复杂车道线解决3.1 split 和merge车道线的解决3.2 大曲率或U形车道…

自然语言处理(NLP)—— 语言检测器

1. 文章概述 1.1 目的 在本篇文章中&#xff0c;我们将构建一个语言检测器&#xff0c;这是一个能够识别文本语言的简单分类器。这是一个能够识别文本是用哪种语言写的程序。想象一下&#xff0c;你给这个程序一段文字&#xff0c;它就能告诉你这是英语、法语还是其他语言。 …

C语言过度C++语法补充(面向对象之前语法)

目录 1. C相较于C语言新增的语法 0. C 中的输入输出 1. 命名空间 1. 我们如何定义一个命名空间&#xff1f; 2. 如何使用一个命名空间 3. 命名空间中可以定义什么&#xff1f; 4. 在 相同或者不同 的文件中如果出现 同名的命名空间 会如何&#xff1f; 5. 总结~~撒花~~…

优维「Easy分析」:一款故障根因分析小神器

背 景 随着微服务架构的普及&#xff0c;现代企业的IT基础设施已经变得越来越复杂。单一的服务可能有多个下游依赖&#xff0c;而这些依赖又可能有自己的子依赖&#xff0c;和主机资源的依赖。在这样的环境中&#xff0c;当某个服务发生故障&#xff0c;确定具体的原因变得尤为…

【Linux】The server quit without updating PID file的几种解决方案

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

微服务架构-微服务实施

目录 一、概述 二、微服务拆分 2.1 概述 2.2 拆分原则 2.3 拆分方法 2.3.1 以数据为维度进行拆分 2.3.2 按照使用场景拆分 2.3.3 重要和非重要的拆分 2.3.4 变和不变的拆分 三、微服务通信 3.1 概述 3.2 微服务通信方式选择 3.3 微服务编排 3.4 API接口设计 3.5 …