Linux -- 认识gcc/g++、代码的编译过程

news2024/9/23 19:29:16

目录

前言:

使用 gcc/g++:

代码的编译过程: 

预处理:

头文件展开:

宏替换+去注释: 

​编辑

条件编译: 

编译:

汇编:

链接:

动态库(动态链接):

静态库(静态链接):


前言:

我们写完一段源代码后,需要让代码跑起来,在Linux中,我们使用 gcc/g++来编译C语言/C++代码。

使用 gcc/g++:

我们现在新建了一个文件,且代码如下:

 gcc  [ 源代码文件名 ] 就可以对指定的代码文件进行编译,编译时会生成一个可执行程序,如果没有为可执行程序命名,默认文件名为 a.out,运行 a.out ,就会运行我们所写的代码!

我们也可以为可执行程序命名,gcc  [ 源代码文件名 ]  -o   [ 可执行程序文件名 ]

-o 后接目标文件

g++ 的使用方法和 gcc 相同,这里不再赘述。

需要区别的是,gcc只能编译 C语言 ,g++可以编译 C语言 和 C++!

代码的编译过程: 

预处理:

预处理时,会对代码进行宏替换、去掉注释、条件编译、头文件展开,如果想查看预处理后的代码,以 gcc 为例:gcc  -E  test.c  -o  test.i ,就可以把预处理后的代码存放到指定的文件中,注意,目标文件后缀为 .i 。

-E 表示从现在开始进行程序的预处理过程,当预处理工作结束后,就停下来,不再进行后续的工作! 

头文件展开:

虽然我们原来的代码只有15行,经过头文件展开后,代码行数已经达到851行!

宏替换+去注释: 

如果代码中有注释和宏定义,预处理时,会进行宏替换和删除注释,通过下面的对比可以看出: 

条件编译: 

由于宏定义时只定义了VERSION1,在条件编译时,只有VERSION1的代码保留下来,其余未定义的全部被动态裁剪了!若只定义了VERSION2,或者没有宏定义,也同理!

可以看出,预处理时,可以对代码进行编辑和裁剪。

我们也可以在预处理的指令中进行宏定义, 即使在源代码中我们没有定义 VERSION1,但我们在指令中定义了,效果和在源代码中定义相同!

指令: gcc -E  test.c  -o  test.i  -D  VERSION1=1

条件编译可以防止头文件重复包含!头文件重复包含,会导致头文件展开时,代码量太大,导致编译效率低下!我们需要规避头文件重复包含!这是个好的编程习惯。  

#ifndef _NAME_H
#define _NAME_H
//头文件内容
#endif

这里的 _NAME_H 可以是自定义的宏,这里的宏应为独一无二的,不可以与文件中的其他宏的名字相同!

# ifndef _NAME_H (if not define _NAME_H )

1、如果宏_NAME_H未定义,那么就会走 #define _NAME_H 语句,定义宏 _NAME_H,并且引入头文件

2、如果宏_NAME_H已经定义了,则不会走 #define _NAME_H 语句,直接进入#endif,不引入头文件

编译:

编译时,把代码转为汇编语言

-S:从现在开始进行程序的编译,当编译工作完成,就停下来!

形成汇编文件,可以直接在预处理的文件上进行编译,也可以直接在源代码上进行编译,即两种写法:gcc  -S  test.c  -o  test.s  (在源代码上)或 gcc  -S  test.i  -o  test.s(在预处理后的文件上)。

汇编:

汇编时,把编译后生成的汇编语言转为二进制语言

-c :从现在开始进行程序的汇编,汇编工作结束后,就停下来!

同样可以在源代码的基础上进行汇编,也可以在编译文件上进行汇编! 

 转为二进制后,代码还不可以运行起来,即使开放了可执行权限,也是运行不起来的!

还需要最后一步--链接! 

链接:

直接 gcc test.o  -o  test 就可以进行链接,所谓链接,就是把代码和库文件进行链接,默认与动态库进行链接

 ldd 可以查看代码和动态库还是静态库产生链接

在 Linux 中,动态库以 .so 结尾,静态库以 .a 结尾;

在Windows中,动态库以 .dll 结尾,静态库以 .lib 结尾。 

动态库(动态链接):

动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入

程序运行时,如果我们需要调用 printf 函数, printf 函数会被修改为库函数中 printf 实现的地址,这时候动态链接就建立好了。

动态库也叫共享库。

优点:比较节省资源(内存资源、网络资源等),不会出现太多的重复的代码;

缺点:对库的依赖性比较强,一旦库丢失,所有依赖该库的程序都无法运行。

 用 file 命令查看文件类型时,可以看出代码是动态链接的:

静态库(静态链接):

编译链接时,把库文件的代码全部加入到可执行文件中

优点:可执行程序不依赖库,同类型平台中进行跨平台使用;

缺点:生成的文件比较大,比较浪费资源(占用内存--内存资源、网络传输时传输量大--网络资源等)。

代码默认与动态库链接,我们也可以让代码与静态库链接:

gcc -o mybin-static  test.c  -static 就可以让代码与静态库链接,但是系统是默认没有安装静态库的,此时静态链接会出错,我们需要在系统中下载静态库!

在普通用户下,sudo  yum  install  -y  glibc-static  libstdc++-static 就可以安装静态库。 

 安装完成后,用 ldd 和 file 命令可以看出,test-static 与静态库链接。

test 是动态链接的,test-static 是静态链接的,通过对比可以看出, 同样的源代码,静态链接的代码占用的空间比动态链接的大很多。

 

本文到这里就结束了,欢迎各位大佬的指正! 

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

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

相关文章

爬取天气数据,利用Pyecharts作轮播图

爬取网站链接:https://lishi.tianqi.com/xiamen/202312.html 爬取了厦门市2023年一整年的天气数据,包括最高温,最低温,天气,风力风向等 爬虫代码: import requests import pandas as pd import csv from…

新手怎么使用《藏文翻译词典》查藏文单词和藏语近义词反义词?手把手教你写藏文作文!

西藏地区的学生常常需要使用藏语写作业写作文,同时还需要学习汉语中文,在这种情况下,一款好用的藏语翻译和藏文词典工具,就显得非常重要了,在这里教大家使用《藏文翻译词典》工具,利用它学习汉语和写好藏文…

excel表格移动一整行或者移动一整列

首先选中一整行,将鼠标移动到边边上,知道出现黑色十字型箭头鼠标头然后按住shift键,同时移动到想去的地方就可以了 注意:mac和Windows都是shift键,mac的option键只是将列复制一份到移动到的地方,然后移动到…

带有子节点的树状表的父节点拖动排序#Vue3#Sortable插件

带有子节点的树状表的父节点拖动排序#Vue3#Sortable插件 使用Sortable插件这里要保证获取到的是父节点的下标&#xff0c;属性newDraggableIndex获取到的就是只有父节点的下标。设置子节点不能被拖动&#xff0c;最后在逐个调用接口进行数据库中顺序的更新。 <template>…

两名程序员与一名运维人员历经整整一天的时间,成功解决了 nacos 登录时出现“ERR CONNECTION RESET,用户名或密码错误”这一棘手问题

上图看页面报错 这是网页应用提示的信息&#xff0c;服务器日志没有明显的错误日志&#xff0c;检查了账号密码是正常的。 再上第二张图 把这个信息发到百度上查找 通过上图的信息大概知道网络层的原因&#xff0c;可能是在网络安全方面被重置了 下面我们就验证下 1、在服务…

谈面向任务的多轮对话系统(TOD)

面向任务对话系统&#xff08;Task-Oriented Dialogue (TOD) Systems)主要是为解决特定任务的&#xff0c;比如订票任务&#xff08;订机票&#xff0c;电影票等&#xff09;&#xff0c;预定饭店等。这种对话往往需要多轮对话才能够完成。 多轮对话的例子 客户预定一个餐厅的…

数字力量助西部职教全面提升——唯众品牌大数据、人工智能系列产品中标甘肃庆阳职院数字经济人才培养基地!

近日&#xff0c;唯众品牌凭借在大数据和人工智能领域深耕多年的技术积累和卓越产品&#xff0c;成功中标庆阳职业技术学院全国一体化算力网络国家枢纽节点数字经济人才培养基地项目&#xff0c;标志着唯众在助力西部职业教育与数字经济融合发展的新征程上迈出了坚实的一步。 …

构建Android studio版的CarSystemUI工程时因为包名一致导致BuildConfig问题

项目场景&#xff1a; 公司计划开发杰发AC8025-Android 12版本车载平台&#xff0c;前期预研需要构建Android studio版的CarSystemUI工程 问题描述 AAOS车载项目里面的CarSystemUI源码默认无Android studio版本&#xff0c;为了后期快速开发调试需要构建Android studio能直接…

JavaWeb__XML、http

目录 一 、XML1.1 常见配置文件类型1.1.1 properties配置文件1.1.2 xml配置文件 1.2 DOM4J进行XML解析1.2.1 DOM4J的使用步骤1.2.2 DOM4J的API介绍 二、 HTTP协议2.1 HTTP简介2.2 请求和响应报文2.2.1 报文的格式2.2.2 请求报文2.2.3 响应报文 一 、XML XML是EXtensible Markup…

使用Puppeteer进行数据抓取保存为JSON

Puppeteer简介 Puppeteer是由Google Chrome团队开发的一个Node库&#xff0c;它提供了一个高级API来控制Chrome或Chromium的无头版本。Puppeteer能够执行各种任务&#xff0c;包括页面导航、内容抓取、屏幕截图、PDF生成等。 主要特点 无头浏览器控制&#xff1a;无需打开浏…

HybridCLR + Addressable 热更新篇(一)

目录 前言一、HybridCLR 和 Addressable 是什么&#xff1f;1. HybridCLR2. Addressable 二、使用步骤1.HybridCLR导入2.HybridCLR配置3.Addressable导入4.Addressable配置 前言 随着移动互联网和游戏行业的快速发展&#xff0c;热更新技术变得越来越重要。热更新能够在不重新…

文华财经红绿多空趋势量化买卖点指标公式源码

LC:REF(CLOSE,1); RSI1:SMA(MAX(CLOSE-LC,0),13,1)/SMA(ABS(CLOSE-LC),13,1)*100; RSIF:90-RSI1,COLOR33DD33; A4:((C-LLV(L,33))/(HHV(H,33)-LLV(L,33)))*67; ABC22:LLV(LOW,10); ABC33:HHV(HIGH,25); 动力线:EMA((CLOSE-ABC22)/(ABC33-ABC22)*4,4); RSV:(C-LLV(L,9))/…

【Unity 实用技巧】为游戏截图添加自定义水印LOGO

1. 前言 大家好&#xff0c;我是Mark。在Unity开发中&#xff0c;屏幕截图功能是一项常用的功能&#xff0c;它常用于游戏分享而默认的截图往往缺乏辨识度。本文将介绍如何在Unity中实现带有自定义LOGO的屏幕截图&#xff0c;话不多说开搞~ 2. 最终效果 3. 示例代码 代码比较…

婴幼儿自闭症的六大警示前兆:家长需警惕的早期信号

婴幼儿自闭症是一种复杂的发育障碍&#xff0c;其早期症状往往较为微妙&#xff0c;但若能及早发现并干预&#xff0c;对孩子的成长至关重要。以下是婴幼儿自闭症的六个主要前兆&#xff1a; 首先&#xff0c;目光呆滞与反应迟钝。婴儿期&#xff0c;孩子应能对外界刺激如声音…

Java基础-组件及事件处理(中)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 BorderLayout布局管理器 说明&#xff1a; 示例&#xff1a; FlowLayout布局管理器 说明&#xff1a; …

Vue3项目如何使用npm link本地测试组件库

一、组件库操作 1、在组件库项目中先运行npm run lib&#xff0c;其效果如下 2、在组件库项目中在运行npm link&#xff0c;其效果如下 会创建一个全局的软连接指向本地的组件库 二、Vue3项目使用 1、在项目中运行 npm link 组件名称&#xff08;即&#xff1a;组件库packag…

Kettle常用参数配置

目录 一、时区二、时间戳三、tinyint类型转换 一、时区 Kettle链接mysql出现报错&#xff1a;Connection failed. Verify all connection parameters and confirm that the appropriate driver is installed. The server time zone value is unrecognized or represents more…

嵌入式单片机,两者有什么关联又有什么区别?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;使用单片机是嵌入式系统的…

HSG金属表面缺陷检测

HSG金属表面缺陷检测 1. 项目背景1.1 项目简述1.2 项目目标 2. 解决方案3. 数据集3.1 收集各种缺陷的图片3.2 利用有限图片创造更多可能3.3 分割图像3.4 打标签 4. 部分代码4.1 数据集划分4.2图像分割4.3 训练模型4.4 预测 5. 预测结果 1. 项目背景 1.1 项目简述 iPad HSG 的…

【运维】磁盘满了怎么办?如何快速找到占用空间的文件和腾出空间

机器用久了&#xff0c;很容易生成很多临时或者无用的文件&#xff0c;占用大量空间造成磁盘不够用。尤其是服务器&#xff0c;当磁盘不够用时&#xff0c;系统会出现莫名其妙的问题&#xff0c;数据库可能会造成数据损坏。此时快速定位可以删除的大文件并及时释放空间&#xf…