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

news2024/9/20 10:57:43

个人主页:点我进入主页

专栏分类: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)

注意等于两边没有空格

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

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

相关文章

matlab图像仿射变换

在Matlab中进行图像的仿射变换通常使用imwarp函数。下面是一个简单的示例代码&#xff0c;以及对应的说明&#xff1a; % 读取图像 image imread(lena.png);% 设置仿射变换矩阵 theta 30; % 旋转角度 scale_factor 1.5; % 缩放因子 shear_factor 0.5; % 剪切因子% 构造仿射…

Ps:海绵工具

海绵工具 Sponge Tool可用于调整图像中特定区域的饱和度&#xff0c;常用于增加或减少颜色的饱和度。 快捷键&#xff1a;O 在特别的灰度图像上&#xff0c;则可用于调整对比度&#xff0c;这可以开发出更多的创意技巧。 ◆ ◆ ◆ 常用操作方法与技巧 1、海绵工具主要用于调整…

二百二十五、海豚调度器——用DolphinScheduler调度执行Flume数据采集任务

一、目的 数仓的数据源是Kafka&#xff0c;因此离线数仓需要用Flume采集Kafka中的数据到HDFS中 在实际项目中&#xff0c;不可能一直在Xshell中启动Flume任务&#xff0c;一是项目的Flume任务很多&#xff0c;二是一旦Xshell页面关闭Flume任务就会停止&#xff0c;这样非常不…

【数据结构与算法】动态规划法解题20240302

这里写目录标题 一、198. 打家劫舍1、动态规划五部曲 二、213. 打家劫舍 II 一、198. 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间…

iOS消息发送流程

Objc的方法调用基于消息发送机制。即Objc中的方法调用&#xff0c;在底层实际都是通过调用objc_msgSend方法向对象消息发送消息来实现的。在iOS中&#xff0c; 实例对象的方法主要存储在类的方法列表中&#xff0c;类方法则是主要存储在原类中。 向对象发送消息&#xff0c;核心…

vscode 引入外部依赖包

背景 我要在vscode中写一些antlr代码生成的cpp代码&#xff0c;但是在引入头文件#include "antlr4-runtime.h"的时候&#xff0c;出现报错&#xff0c;显示没有这个头文件&#xff0c;显然这是我们没有导入相关的包&#xff0c;因此我首先尝试了将antlr4的依赖源码在…

超链接和导航:网页互动的艺术

引言 在上一篇文章中&#xff0c;我们探索了HTML中多媒体的交互体验&#xff0c;本次我们将学习如何通过超链接和导航栏提升网页的用户体验&#xff0c;让用户在网页访问时更高效&#xff1b; 一、介绍 在这个信息爆炸的时代&#xff0c;如何让用户在第一时间找到他们需要的信…

相机格式化了还能恢复照片吗?内存卡数据恢复方法

相机已成为我们记录生活、工作和学习的重要工具。然而当相机意外格式化后&#xff0c;许多珍贵的照片可能会瞬间消失&#xff0c;这无疑给我们的生活和工作带来不小的困扰。那么相机格式化后&#xff0c;我们是否还有机会找回那些丢失的照片呢&#xff1f; 首先我们需要了解相机…

CSS的弹性布局

CSS 的弹性布局 前言 前端中为了实现页面的布局效果&#xff0c;采用的一个技术手段&#xff0c;它在前端开发的技术场景是非常广泛的 实现上述区域的页面相关的布局效果&#xff0c;就可以使用弹性布局来完成 弹性布局(flex布局) flex 是 flexible box 的缩写&#xff0c;…

ChromeDriver全版本下载教程

确定自己的Chrome版本 step1. 打开Chrome浏览器右上角的三个点&#xff0c;再点击设置 step2. 在设置中点击“关于Chrome”&#xff0c;圈起来的红框即为当前Chrome版本&#xff0c;我的版本就是121.0.6167.185 在json中查找自己对应ChromeDriver版本下载链接 一般教程会让你…

3dmax corona渲染器和vray渲染器哪个好?

Corona和Vray这两个渲染器都很不错&#xff0c;每个都有自己的优点和适用的情况&#xff0c;所以很难说哪个更好。 下面我简单给你对比一下&#xff1a; 1、操作界面&#xff1a;Vray的界面比较多&#xff0c;参数设置也复杂一点&#xff0c;初学者可能会觉得有点难上手。但C…

凌特杯,第二届,数字音频传输。simulink matlab

终于比赛进入了尾声&#xff0c;最为指导老师也是非常的激动。接下来进入了论文写作阶段和视频拍摄阶段。 第二届凌特杯规定的硬件是ADI的Pluto&#xff0c;成本在2k以内&#xff0c;能支持MATLAB&#xff0c;它能够流畅的实时播放接收到的音乐数据&#xff0c;并把数据保存成…

解决Unable to load class ‘org.gradle.api.attributes.VerificationType‘

在使用AdnroidStudio开发过程中难免会遇到Unable to load class org.gradle.api.attributes.VerificationType报错&#xff0c;可以尝试清理缓存重启解决 打开 File-》Invalidate Caches... 重启AndroidStudio后&#xff0c;重新加载即可&#xff0c;但也不是百分百解决。

网络安全学习笔记1

1.了解kali及安装 vmware安装&#xff0c;用户名密码均为kali 2.metasploit是什么 3.metasploit攻击windows系统 在kali中打来终端 数据msfconsole 进入metasploit的控制终端界面 msf的使用法则&#xff1a; 1.使用模块 2.配置模块必选项 3.运行模块 三步操作、实现对…

机器学习高手之路:发现TensorFlow学习网站的无限可能!

介绍&#xff1a;TensorFlow是一个由Google团队开发的端到端开源机器学习平台&#xff0c;专为数值计算和机器学习而设计。以下是对TensorFlow的详细介绍&#xff1a; 开发背景与历史&#xff1a;TensorFlow起源于谷歌的神经网络算法库DistBelief。它被设计成一个灵活的深度学习…

c语言经典测试题9

1.题1 #include <stdio.h> int main() { int i 1; sizeof(i); printf("%d\n", i); return 0; } 上述代码运行结果是什么呢&#xff1f; 我们来分析一下&#xff1a;其实这题的难点就是sizeof操作后i的结果是否会改变&#xff0c;首先我们创建了一个整型i&a…

WPF真入门教程31--WPF版房屋租售系统

1、教程回顾 到现在为止&#xff0c;“蒸”入门系列教程已完成了30刺由浅入深地讲解&#xff0c;当然不可能讲到了WPF的所有技能点&#xff0c;但读者看到了wpf的内部各种功能及之间的联系&#xff0c;在此基础上&#xff0c;再提供一个完整有效的综合项目&#xff0c;本项目采…

Blazor系统教程(.net8)

Blazor系统教程 1.认识 Blazor 简单来讲&#xff0c;Blazor旨在使用C#来替代JavaScript的Web应用程序的UI框架。其主要优势有&#xff1a; 使用C#编写代码&#xff0c;这可提高应用开发和维护的效率利用现有的NET库生态系统受益于NET的性能、可靠性和安全性与新式托管平台(如…

企业指标体系建设与管理:运用MECE原则与战略地图,打造完美闭环

在数字化时代&#xff0c;数据已经成为企业的核心资产。为了更好地利用这些数据&#xff0c;企业需要建立一套科学、完整、高效的指标体系。而在这个过程中&#xff0c;MECE原则&#xff08;Mutually Exclusive, Collectively Exhaustive&#xff0c;即“相互独立&#xff0c;完…

JVM 第二部分-2(堆,方法区)

4.堆 堆 一个Java程序&#xff08;main方法&#xff09;对应一个jvm实例&#xff0c;一个jvm实例只有一个堆空间堆是jvm启动的时候就被创建&#xff0c;大小也确定了。大小可以用参数设置。堆是jvm管理的一块最大的内存空间 核心区域&#xff0c;是垃圾回收的重点区域堆可以位…