gcc与g++的原理

news2024/11/17 0:29:40

程序的翻译

  • 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.coloradmin.cn/o/1800113.html

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

相关文章

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十三)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 20 - 21节&#xff09; P20《19.ArkUI-属性动画和显式动画》 本节先来学习属性动画和显式动画&#xff1a; 在代码中定义动画&am…

Qt开发技术:Q3D图表开发笔记(四):Q3DSurface三维曲面图颜色样式详解、Demo以及代码详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139424086 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子网络科技博…

centos安装vscode的教程

centos安装vscode的教程 步骤一&#xff1a;打开vscode官网找到历史版本 历史版本链接 步骤二&#xff1a;找到文件下载的位置 在命令行中输入&#xff08;稍等片刻即可打开&#xff09;&#xff1a; /usr/share/code/bin/code关闭vscode后&#xff0c;可在应用程序----编程…

Matplotlib常见图汇总

Matplotlib是python的一个画图库&#xff0c;便于数据可视化。 安装命令 pip install matplotlib 常用命令&#xff1a; 绘制直线&#xff0c;连接两个点 import matplotlib.pyplot as plt plt.plot([0,5],[2,4]) plt.show() 运行结果如下&#xff1a; 多条线&#xff1a;…

计算机组成实验---Cache的实现

直接映射 先看懂cache的映射原理&#xff0c;根据cache大小与主存大小来计算各个信号线的位数 各个信号线位数 主存地址在逻辑上分为区号、块号、块内地址 Cache结构 Cache访问原理 基本过程 状态机&#xff1a;“三段式”实现 6.3 Verilog 状态机 | 菜鸟教程 (runoob.com) …

Proxyman 现代直观的 HTTP 调试代理应用程序

Proxyman 是一款现代而直观的 HTTP 调试代理应用程序&#xff0c;它的功能强大&#xff0c;使您可以轻松捕获、检查和操作 HTTP(s) 流量。不再让繁杂的网络调试工具阻碍您的工作&#xff0c;使用 Proxyman&#xff0c;您将轻松应对网络调试的挑战。 下载地址&#xff1a;https…

el-table 固定前n行

el-table 固定前n行 第一种&#xff0c;通过设置前几行粘性布局 <el-table:data"tableData2"borderheight"calc(98% - 40px)"// 设置行样式:row-class-name"TableRowClassName"selection-change"handleSelectionChange" ><…

计网期末复习指南(四):网络层(IP协议、IPv4、IPv6、CIDR、ARP、ICMP)

前言&#xff1a;本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点&#xff0c;从计算机网络体系结构出发到应用层&#xff0c;每一个协议层通过一篇文章进行总结&#xff0c;本系列正在持续更新中... 计网期末复习指南&#xff08;一&#xff09;&#xff1a;计算…

Java 初识

Java 的发展历程 Sun 公司。 Oracle 公司。 普通版本&#xff0c;也叫过渡版本。 正式版本&#xff0c;也叫长期支持版本&#xff08;LTS&#xff09;。 Java SE&#xff0c;Java EE&#xff0c;Java ME Java 技术体系分为三个平台&#xff1a;Java SE&#xff0c;Java EE&a…

【全开源】Fastflow工作流系统(FastAdmin+ThinkPHP)

&#x1f680;Fastflow工作流系统&#xff1a;高效协作&#xff0c;流程无忧​ 一款基于FastAdminThinkPHP开发的可视化工作流程审批插件&#xff0c;帮助用户基于企业业务模式和管理模式自行定义所需的各种流程应用&#xff0c;快速构建企业自身的流程管控体系&#xff0c;快…

Windows mstsc

windows mstsc 局域网远程计算机192.168.0.113为例&#xff0c;远程控制命令mstsc

【mysql】数据报错: incorrect datetime value ‘0000-00-00 00:00:00‘ for column

一、问题原因 时间字段在导入值0000-00-00 00:00:00或者添加 NOT NULL的时间字段时&#xff0c;会往mysql添加0值&#xff0c;此时可能出现此报错。 这是因为当前的MySQL不支持datetime为0&#xff0c;在MySQL5.7版本以上&#xff0c;默认设置sql_mode模式包含NO_ZERO_DATE, N…

SQL Server数据库xp_cmdshell提权笔记

文章目录 一、简介二、搭建环境三、利用条件1、查询 xp_cmdshell 是否开启&#xff0c;返回为1则证明存在2、判断权限是不是sa&#xff0c;回是1说明是sa3、开启xp_cmdshell4、关闭xp_cmdshell 四、获取数据库权限1、成功获取sqlserver&#xff0c;进行登陆2、开启xp_cmdshell权…

记录汇川:红绿灯与HMI-ST

项目要求&#xff1a; 子程序&#xff1a; 子程序&#xff1a; 实际动作如下&#xff1a; 红绿灯与HMI-ST

ChatGPT交卷2024年高考新课标I卷语文关于AI方面的作文试题

2024年新课标I卷作文试题&#xff1a; 阅读下面的材料&#xff0c;根据要求写作。&#xff08;60分&#xff09; 随着互联网的普及、人工智能的应用&#xff0c;越来越多的问题能很快得到答案。那么&#xff0c;我们的问题是否会越来越少&#xff1f; 以上材料引发了你怎样的…

DBeaver入门教学,开源免费,链接数据库的软件

这个可爱的头像就是它 为什么要用这个&#xff0c;小公司一般都用navicat什么的&#xff0c;因为别人一般不会告你&#xff0c;因为告你也没啥钱&#xff0c;但是公司大了有知名度了&#xff0c;用盗版软件就会被告。所以很多好不容易从小做到大的公司&#xff0c;是不允许这种…

使用智谱 GLM-4-9B 和 SiliconCloud 云服务快速构建一个编码类智能体应用

本篇文章我将介绍使用智谱 AI 最新开源的 GLM-4-9B 模型和 GenAI 云服务 SiliconCloud 快速构建一个 RAG 应用&#xff0c;首先我会详细介绍下 GLM-4-9B 模型的能力情况和开源限制&#xff0c;以及 SiliconCloud 的使用介绍&#xff0c;最后构建一个编码类智能体应用作为测试。…

前端解析文件流格式数据异常时并给提示

把后端返回的文件流格式转换成正常数据格式 断点调试返回值 network查看返回值 一、blob类型 let stringData:any await this.blobToString(res); blobToString(blob) { return new Promise((resolve, reject) > { const reader new FileReader(); reader.onloadend (…

Oracle EBS AP发票创建会计科目提示:APP-SQLAP-10710:无法联机创建会计分录

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: 提交“创建会计科目”请求提示错误信息如下: APP-SQLAP-10710:无法联机创建会计分录。 请提交应付款管理系统会计流程,而不要为此事务处理创建会计分录解决方法 数据修复SQL脚本: UPDATE ap_invoi…

ChatGPT-4o独家揭秘:全国一卷高考语文作文如何轻松斩获满分?

​一、2024年全国一卷高考 二、2018年全国一卷高考 三、2016年全国一卷高考 一、2024年全国一卷高考 技术进步的悖论&#xff1a;我们的问题真的在减少吗&#xff1f; 引言 随着互联网的普及和人工智能的应用&#xff0c;越来越多的问题能够快速得到解答。然而&#xff0c;这引…