Linux之gcc和makefile的使用详细解析

个人主页:点我进入主页

专栏分类:C语言初阶  C语言进阶  数据结构初阶    Linux    C++初阶    算法

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂

目录

一.gcc/g++安装 

二.gcc运行代码

三.gcc是如何完成的

3.1预处理

3.2编译

3.3汇编

3.4链接

四.makefile自动化构建

4.1背景

4.2简单的makefile文件

4.3如何使用我们的makefile

4.4.PHONY:的用处

4.5利用变量编写makefile


一.gcc/g++安装 

        在使用这个之前我们需要先进行gcc/g++的安装,当我们不是root账户时我们输入指令:

sudo yum -y install gcc gcc-c++ autoconf make

当我们是root指令时我们输入指令

yum -y install gcc gcc-c++ autoconf make

当我们安装好后我们输入指令

gcc -v

我们可以看到我们的版本信息。

二.gcc运行代码

我们先写一段代码

#include<stdio.h>

int main()
{
    printf("Hello Linux\n");
    printf("Hello Linux\n");
    printf("Hello Linux\n");
    printf("Hello Linux\n");
    return 0;
}

我们保存退出后,输入指令

gcc test.c

我们可以看到

会生成一个a.out可执行程序,当然我们可以使用-o选项进行重命名如下:

gcc test.c -o test.exe

我们运行可执行程序时需要输入指令

./test.exe

三.gcc是如何完成的

3.1预处理

        我们的c语言代码在生成可执行程序时会先经过预处理阶段,预处理阶段是将头文件展开,宏替换,条件编译,注释替换这些过程,我们看下面代码:

#include<stdio.h>
#define MAX 3

int main()
{
#if 1==1
    int a=MAX;
    printf("%d\n",a);//条件
#elif 0
    printf("elif\n");
#else
    printf("else\n");
#endif
    return 0;
}

我们想看我们的预处理阶段产生的代码我们可以输入指令

gcc -E test.c -o test.i

我们利用vim打开我们的test.i

 我们可以看到有800多行,其中的头文件展开导致出现了800多行,我们定义的宏MAX被替换为了3,我们的注释被替换为了空格,条件编译是只保留了有效的部分。注意预处理阶段不会减产代码的方法错误,例如我们将printf后面的分号去掉我们依旧可以指向我们的预处理

3.2编译

我们生成可执行程序时经过预处理阶段后就会进入编译阶段,编译阶段就是检查代码是否有语法错误,是否规范,没有错误后生成汇编代码。我们想要进行编译阶段需指令

gcc -S test.i -o test.s

由于上面我们将代码进行修改我们可以看到

所以在编译阶段会对代码进行语法是否有错误,我们修改后再输入指令然后用vim打开tes.s文件可以看到;

这里面的信息就是我们的汇编代码。

3.3汇编

汇编阶段就是将程序生成二进制代码,我们输入指令然后用vim进行查看test.o的内容

gcc -c test.s -o test.o 

 

3.4链接

链接就是生成可执行程序,如果我们有多个文件还会进行符号表的合并,我们输入指令

gcc test.o -o test.exe

我们运行test.exe文件

四.makefile自动化构建

4.1背景

        会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。ake是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

4.2简单的makefile文件

首先我们先创建一个文本makefile(名字),然后用vim进行编译,文本的内容如下:

test.exe:test.c
	gcc test.c -o test.exe
.PHONY:
clean:
	rm -rf test.exe

 我们对其进行逐行分析,在第一行中test.exe是目标文件test.c是依赖文件,整体的test.exe:test.c依赖关系,第二行gcc test.c -o test.exe依赖方法,第三行先不解释,第四行是依赖关系,第五行是依赖方法。

4.3如何使用我们的makefile

我们输入make是默认执行第一个依赖方法

make

我们看到它自动转换为我们的第一条依赖方法,那如何执行我们的第二条依赖方法呢?我们输入

make clean

就会自动生成我们的抵赖方法。

4.4.PHONY:的用处

我们的第一个依赖关系前没有.PHONY:第二条依赖关系有.PHONY:这个有什么用处呢?我们看我们连续输入两次make可以看到:

我们第二次就不能再执行了,但是我们连续两次输入make clean可以看到

它依旧可以生成,我们猜测它有一种机制来检查是否可以使用,而.PHONY:就是将这个检查机制进行关闭,事实上是根据修改时间来确定的。我们重新生成一个test.exe

 

我们输入

stat test.exe

 

这个就是根据比较我们的Modify的时间和test.exe的时间是否相同,相同就不会执行不同就会执行,而.PHONY就是无论相不相同都会执行。

4.5利用变量编写makefile

cur=test.exe
src=test.c
$(cur):$(src)
	gcc $(src) -o $(cur)
.PHONY:
clean:
	rm -rf $(cur)

注意等于两边没有空格

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Leetcode每日一刷】贪心算法|122.买卖股票的最佳时机 II、55. 跳跃游戏

一、122.买卖股票的最佳时机 II 力扣题目链接 &#x1f984;解题思路&#xff1a; 首先需要明确的几个点&#xff1a; 当前只能有最大一支股票每一天操作只能3选1&#xff1a;买or卖or休息 此外&#xff0c;对于贪心&#xff0c;总有像下面图示的一种直觉&#xff1a;如果…

11.盛最多水的容器

题目&#xff1a;给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 解题思路&#xff1a;可以…

算法打卡day5|哈希表篇01|Leetcode 242.有效的字母异位词 、19.删除链表的倒数第N个节点、202. 快乐数、1. 两数之和

哈希表基础知识 哈希表 哈希表关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素&#xff1b;数组就是哈希表的一种 一般哈希表都是用来快速判断一个元素是否出现集合里。例如要查询一个名字是否在班级里&#xff1a; 要枚举的话时间复杂度是O(n)&…

【开源】JAVA+Vue.js实现天沐瑜伽馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课程预约模块2.4 系统公告模块2.5 课程评价模块2.6 瑜伽器械模块 三、系统设计3.1 实体类设计3.1.1 瑜伽课程3.1.2 瑜伽课程预约3.1.3 系统公告3.1.4 瑜伽课程评价 3.2 数据库设计3.2.…

【C语言】动态内存管理常用函数

前言 我们在之前学习的数组开辟的空间是固定不变的&#xff0c;有时候我们需要的空间⼤⼩在程序运⾏的时候才能知道~ c语言中的动态内存开辟&#xff0c;让程序员⾃⼰可以根据实际需求申请和释放相应空间&#xff0c;这使得空间的开辟变得灵活了许多。 欢迎关注个人主页&#x…

【C++进阶】哈希表的闭散列和开散列(哈希桶)的代码实现

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

mariadb数据库——安装,创建数据库

MariaDB是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是MySQL的一个分支。 安装 apt -y install mariadb-servervi /etc/mysql/mariadb.conf.d/50-server.cnf character-set-server utf8mb4 collation-server utf8mb4_general_c…

什么时候要用到Reflect API?

参考文档 https://www.zhihu.com/question/460133198 https://cn.vuejs.org/guide/extras/reactivity-in-depth.html https://juejin.cn/post/7103764386220769311 Reflect API 一般搭配 Proxy API 一起使用。什么是 Proxy API 呢&#xff1f; 先回顾下 vue 的数据响应性是如何…

【已解决】卸载软件时显示“无法使用此产品的安装源,请确认安装源存在,并且你可以访问它”报错截图如下

卸载软件时显示“无法使用此产品的安装源&#xff0c;请确认安装源存在&#xff0c;并且你可以访问它”报错截图如下 使用Uninstall Tool软件强制删除&#xff0c;绕过软件自带的uninstall程序。&#xff08;小白推荐&#xff0c;如下图&#xff09; Uninstall Tool - Unique…

【DAY06 软考中级备考笔记】数据结构:树

数据结构&#xff1a;树 3月1日 – 天气&#xff1a;晴 之前在B站看的视频讲的是在太过简单&#xff0c;弃了。现在换了新的视频继续&#xff0c;后续会重新看前面的视频补过来。https://www.bilibili.com/video/BV1pT4m1S7uH/ 1. 树的基本概念 需要注意的是&#xff1a; 并不是…

代码随想录算法训练营第五天

● 自己看到题目的第一想法 242. 有效的字母异位词 方法&#xff1a; 方法一&#xff1a; 暴力法 1. 分别对s, t排序 2. 遍历s与t 判断s[i]!t[i] 返回 false 否则 返回true思路&#xff1a; 注意&#xff1a; 代码&#xff1a; bool cmp(char a, char b){return a<b;…

解决GitHub无法访问的问题:手动修改hosts文件与使用SwitchHosts工具

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

Node.js+Express后端,自定义接口

6分钟学会Express 后端 API 开发 Node.js 2020最新版_哔哩哔哩_bilibili 要使用Node.js和Express搭建一个简单的后台服务器&#xff0c;用于接收带有token的请求头&#xff0c;你可以按照以下步骤进行操作&#xff1a; 首先&#xff0c;确保你已经安装了Node.js和npm&#xff0…

OpenAI员工自曝996作息表,网友:真正的卷不需要强迫

鱼羊 发自 凹非寺 量子位 | 公众号 QbitAI OpenAI也996&#xff0c;实锤了&#xff08;doge&#xff09;。 思维链作者、从谷歌跳槽OpenAI的Jason Wei刚刚分享了自己在OpenAI的一天&#xff1a; [9:00am] 起床 [9:30am] 搭乘Waymo前往Mission SF&#xff0c;途中在Tartine买…

一篇文章带你搞定企业级完整性能测试流程

大部分公司在最初试的阶段只会关心项目的基本功能&#xff0c;能用就可以。但是随着项目的成熟&#xff0c;用户量逐步的增大&#xff0c;线上经常就会出现一些系统崩溃&#xff0c;用户反映系统太慢等性能问题的爆发。所以&#xff0c;性能测试的需求就逐步变得迫切了。所以&a…

【笔记】深度学习入门:基于Python的理论与实现(六)

深度学习 深度学习是加深了层的深度神经网络 加深网络 本节我们将这些已经学过的技术汇总起来&#xff0c;创建一个深度网络&#xff0c;挑战 MNIST 数据集的手写数字识别 向更深的网络出发 基于33的小型滤波器的卷积层。激活函数是ReLU。全连接层的后面使用Dropout层。基…

varFormatter 数据格式化库 以性能优先的 快速的 内存对象格式转换

varFormatter 数据格式化 技术 开源技术栏 对象/变量格式化工具库&#xff0c;其支持将一个对象进行按照 JSON XML HTML 等格式进行转换&#xff0c;并获取到结果字符串&#xff01; 目录 文章目录 varFormatter 数据格式化 技术目录介绍获取方式 使用实例格式化组件的基本使…

【C++初阶】内存管理

目录 一.C语言中的动态内存管理方式 二.C中的内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 3.浅识抛异常 &#xff08;内存申请失败&#xff09; 4.new和delete操作自定义类型 三.new和delete的实现原理 1.内置类型 2.自定义类型 一.C语…

电机应用-正点原子直流有刷电机例程笔记

目录 基础驱动实验&#xff1a;调速和换向 初始化工作 电机基础驱动API 电压、电流、温度检测实验 初始化工作 采集工作 编码器测速实验 编码器接口计数原理 初始化工作 编码器测速工作 速度环控制实现 PID相关函数 PID运算 电流环控制实现 PID相关函数 PID运算…

代码随想录算法训练营第三十三天|1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

1005.K次取反后最大化的数组和 刷题https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/文章讲解https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.…