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.mzph.cn/bicheng/24359.shtml

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

相关文章

什么是哈希冲突?如何解决哈希冲突?HashMap和TreeMap之间的区别?

Map 和 Set 的概念 Map和Set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关 。 为什么说它是一种专门用来进行搜索的数据结构呢&#xff1f; 我们应该都用过“遍历查找”、“二分查找”&#xff0c;这两种方式也都是用来对目标…

Spring Security系列之PasswordEncoder

概述 任何一个登录系统的密码不能明文存储&#xff0c;万一发生数据库泄漏事故&#xff08;不管是内部人员导出数据库数据还是被黑客攻击破解数据库实例节点拿到数据库数据等&#xff0c;又或者是其他情况造成的&#xff09;&#xff0c;将产生巨大的损失。因此明文密码在存储…

DOS 操作系统

DOS 介绍 DOS&#xff1a;disk operating system&#xff0c;磁盘操作系统。 中国DOS联盟下载 MS-DOS 7.10完整安装版&#xff08;含图形安装程序&#xff09; DOS 环境下的操作 输入部分内容后按下 Tab 可以快速自动补全。 按住 Ctrl 键可以用鼠标滚轮改变字号大小。 DO…

【数据结构初阶】--- 顺序表

顺序表&#xff0c;好像学C语言时从来没听过&#xff0c;实际上就是给数组穿了层衣服&#xff0c;本质是一模一样的。 这里的顺序表实际是定义了一个结构体&#xff0c;设计各种函数来实现它的功能&#xff0c;比如说数组中的增删改查插入&#xff0c;这些基本操作其实平时就会…

c++调用动态库LNK2019无法解析的外部符号LNK1120无法解析的外部命令

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK1120 6 个无法解析的外部命令 ConsoleApplication1 D:\vs_qt_project\ConsoleApplication1\x64\Debug\ConsoleApplication1.exe 1 严重性 代码 说明 项目 文件 行 …

应用层——HTTP协议(自己实现一个http协议)——客户端(浏览器)的请求做反序列化和请求分析,然后创建http向响应结构

应用层&#xff1a;之前我们写的创建套接字&#xff0c;发送数据&#xff0c;序列化反序列化这些都是在写应用层 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层 之前的网络计算机是我们自定义的协议&#xff1a;传输的数据最终是什么样的结…

高级文件操作

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Python内置的os模块除了可以对目录进行操作&#xff0c;还可以对文件进行一些高级操作&#xff0c;具体函数如表4所示。 表4 os模块提供的与文件相…

【AI基础】第三步:纯天然保姆喂饭级-安装并运行chatglm2-6b

chatglm2构建时使用了RUST&#xff0c;所以在安装chatglm2之前&#xff0c;先安装RUST。 此系列文章列表&#xff1a; 【AI基础】第一步&#xff1a;安装python开发环境-windows篇_下载安装ai环境python-CSDN博客 【AI基础】第一步&#xff1a;安装python开发环境-conda篇_mini…

知识图谱的应用---智慧司法

文章目录 智慧司法典型应用 智慧司法 智慧司法是综合运用人工智能、大数据、互联网、物联网、云计算等信息技术手段&#xff0c;遵循司法公开、公平、公正的原则&#xff0c;与司法领域业务知识经验深度融合&#xff0c;使司法机关在审判、检查、侦查、监管职能各方面得到全面的…

【数据结构】图论入门

引入 数据的逻辑结构&#xff1a; 集合&#xff1a;数据元素间除“同属于一个集合”外&#xff0c;无其他关系线性结构&#xff1a;一个对多个&#xff0c;例如&#xff1a;线性表、栈、队列树形结构&#xff1a;一个对多个&#xff0c;例如&#xff1a;树图形结构&#xff1…

SpringBoot中的WebMvcConfigurationSupport和WebMvcConfigurer

在SpringBoot中可以通过以下两种方式来完成自定义WebMvc的配置&#xff1a; &#xff08;1&#xff09;继承WebMvcConfigurationSupport类 &#xff08;2&#xff09;实现WebMvcConfigurer接口 通过这两种方式完成的WebMvc配置存在差异&#xff0c;本文将对此作简单说明与区…

【Vue】单页应用程序介绍

通常基于Vue去开发一整个网站&#xff0c;开发出来的这整个网站应用&#xff0c;我们都会叫做单页应用程序 概念 单页应用程序&#xff1a;SPA【Single Page Application】是指所有的功能都在一个html页面上实现 我们可以将页面共用的部分封装成组件&#xff0c;底下要切换的也…

工具-金舟投屏软件: 手机如何投屏到电脑上 / Wi-Fi / USB

金舟安卓/iOS苹果投屏-正版软件下载中心 方法一、金舟投屏软件-wifi 1.1、准备工作 确保苹果手机和Windows电脑都连接到同一个Wi-Fi网络。 在Windows电脑上安装并打开金舟投屏软件。 1.2、操作步骤 在金舟投屏软件上选择“苹果手机投屏”功能。 在苹果手机上下滑屏幕&am…

New Work-flow of Circuit Bootstrapping

参考文献&#xff1a; [CGGI17] Chillotti I, Gama N, Georgieva M, et al. Faster packed homomorphic operations and efficient circuit bootstrapping for TFHE. ASIACRYPT 2017 (1): 377-408.[CDKS21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion be…

dots_image 增强图像中的圆点特征

dots_image 增强图像中的圆点特征 1. dot_image 有什么用途&#xff1f;2. 点状字符的特征增强3. Halcon代码 1. dot_image 有什么用途&#xff1f; Enhance circular dots in an image. 这个算子可以增强图像中的圆点特征&#xff0c;例如下面的例子。 2. 点状字符的特征增强…

忆恒创源国产系列新品 —— PBlaze7 7A40 取得 PCI-SIG 兼容性认证

在此前报道中&#xff0c;我们曾预告了忆恒创源国产系列 PCIe 5.0 SSD 新品 —— PBlaze7 7A40&#xff0c;今天&#xff0c;这款 SSD 已经顺利通过 PCI-SIG 的严格测试并出现在 Integrators List 集成商列表当中&#xff0c;标志着距离 PBlaze7 7A40 的正式发布又近了一步。 正…

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

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

STM32项目分享:智能门禁锁系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.c…

基于某评论的TF-IDF下的LDA主题模型分析

完整代码&#xff1a; import numpy as np import re import pandas as pd import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import LatentDirichletAllocationdf1 pd.read_csv(小红书评论.csv) # 读取同目录下csv文件…

【Vue】组件化开发

文章目录 一、介绍二、根组件 App.vue 一、介绍 组件化&#xff1a;一个页面可以拆分成一个个组件&#xff0c;每个组件有着自己独立的结构、样式、行为。 好处&#xff1a;便于维护&#xff0c;利于复用 → 提升开发效率。 组件分类&#xff1a;普通组件、根组件。 根组件…