Linux工程管理文件Makefile-入门篇

news2024/9/22 5:32:40

1.Makefile简介

Makefile是在Linux环境下 C/C++ 程序开发必须要掌握的一个工程管理文件。当你使用make命令去编译一个工程项目时,make工具会首先到这个项目的根目录下去寻找Makefile文件,然后才能根据这个文件去编译程序。那Makefile在编译过程中到底起了什么作用呢?这还得从程序的编译链接过程说起。

在Windows下编写程序,你只要会使用集成开发环境(IDE,Integrated Development Environment)就可以了,因为IDE集成了程序的编写、编译、链接、运行、项目管理等一条龙服务,一个编程小白,安装好IDE后,新建一个文件,编写好程序,点击菜单栏上的运行(Run)按钮,程序就可以跑起来了,程序员不需要关心程序在底层是如何编译和运行的。

而在Linux下编写程序,因为早期没有成熟的IDE,一般都是使用不同的命令进行编译:将源文件分别使用编译器、汇编器、链接器编译成可执行文件,然后手动运行。以一个最简单的helloworld程序为例:

// helloworld.c
#include <stdio.h>
int main(void){    
	printf("hello QST.com!\\n");    
	return 0;
}

如果想要将上面的 helloworld.c 编译成可执行文件,一般需要预处理、编译、汇编、链接四个步骤,每个步骤会分别调用预处理器、编译器、汇编器、链接器来完成。

在Linux环境下,如果你安装了GCC编译器,你会看到在程序的安装目录下面会有各种二进制可执行文件:

  • cpp:预处理器
  • ccl:编译器
  • as:汇编器
  • ld:链接器
  • ar:静态库制作工具

程序在编译过程中会分别使用这些工具,完成程序编译的每个流程。为了简化程序编译流程,GCC编译器一般会提供一个gcc命令,当你使用gcc命令去编程程序时:

# gcc -o a.out helloworld.c

gcc会分别调用预处理器、编译器、汇编器和链接器来自动完成程序编译的整个过程,不需要用户一个命令一个命令分别输入了。

当然,gcc还提供了一些列参数,用来控制编译流程。如果你只想对 helloworld.c 进行预处理,不作编译。你可以使用-E参数来完成:

# gcc -E helloworld.c

如果你想helloworld.c只做汇编处理,可以使用下面的命令,就可以将源文件 helloworld.c 编译为汇编文件helloworld.S:

# gcc -S -o helloworld.S helloworld.c

如果你只想对源文件进行编译,不链接,可以使用-c参数,就可以将 helloworld.c 编译为对应的目标文件 helloworld.o:

# gcc -c -o helloworld.o helloworld.c

对于一些简单的程序,单文件程序,使用gcc编译非常方便。当一个项目很大,源文件很多时,此时再使用gcc编译,可能就变成了下面这个样子:

# gcc -o a.out helloworld.c module1.c module2.c module3.c ...

以Linux内核源码为例,有好几万个源文件(.c、.S和.h),如果还使用gcc编译的话,每编译一次,都要敲进去几万个源文件,太折腾了,此时自动化编译工具make就派上用场了:使用make编译程序,不需要每次都输入源文件,直接在命令行下敲击make命令,就可一键自动化完成编译。

make编译依赖Makefile文件。所以在使用make命令编译程序之前,你还需要编写一个Makefile文件:

a.out: helloworld.o    
	gcc -o a.out helloworld.o
helloworld.o: helloworld.c    
	gcc -c -o helloworld.o helloworld.c
clean:    
	rm -f a.out helloworld.o

编写Makefile文件后,把它和helloworld.c源文件放在同一个目录,进入这个目录,直接敲击make密令,就可以自动完成程序的编译了。

wit@pc:/home/makefile
# ls
helloworld.cMakefilewit@pc:/home/makefile# makegcc -o a.out helloworld.cwit@pc:/home/makefile# lsa.out  helloworld.c  helloworld.oMakefilewit@pc:/home/makefile# ./a.outhello world!wit@pc:/home/makefile# make cleanrm -f a.out helloworld.owit@pc:/home/makefile# lshelloworld.cMakefile

makefile的文件名通常有三种格式:Makefile、makefile、GNUmakefile,make会在当前目录下自动寻找找三个文件名,如果没有找到的话,make就无法继续编译程序,产生一个错误并退出:

make: *** No targets specified and no makefile found.  Stop.

 2.Makefile学习的重要性

Makefile在整个项目工程管理和程序的编译链接过程中,都扮演了一个非常重要的角色,是linux/Unix环境下开发必备技能,也是系统架构师、项目经理的核心技能。掌握了Makefile,会让你对底层软件的构造系统、程序的编译过程有一个更深的理解。

掌握了Makefile的基本原理,然后跟Windows下的IDE进行比较,你会发现,它们的工作原理也是大同小异,是相通的:

当你在C-Free或者VC++6.0环境下,通过工程管理器、资源管理器类似的窗口,往项目中添加源文件时,在底层会自动生成对应的​​​​​​​Makefile类似的文件。当你点击编译或运行按钮时,IDE会根据这个​​​​​​​Makefile文件去编译程序。不同的IDE,对应的Makefile文件名、文件格式可能有所差异,比如VC++6.0使用的是Nmake,但原理都是一样的:通过​​​​​​​Makefile,我们可以构建编译一个可执行文件a.out需要的源文件。根据这个依赖关系,make工具就可以分别调用gcc命令分别将每个源文件编译成对应的目标文件,然后将它们链接成最后的可执行文件:a.out

会不会写Makefile,是侧面可以看出一个人是否具有完成大型项目工程的能力。如果你是在Linux下进行C/C++开发,掌握​​​​​​​Makefile可能让你更深地去理解项目,去掌控整个项目的构建和维护。

Makefile也是一个研究开源项目的利器。很多开源项目可能文档不完整,而Makefile就是开源项目的地图,从Makefile入手,可以让你快速窥探整个开源项目的框架和概貌,让你深入代码而不至于迷路。

综上所述,如果你是一名Linux下的开发工程师、嵌入式工程师、内核驱动开发工程师,掌握Makefile是一门必备技能。它和git、vim一样,掌握了这个“Linux三剑客”会让你的工作事半功倍、更加高效。

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

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

相关文章

T7:咖啡豆识别

T7&#xff1a;咖啡豆识别 **一、前期工作**1.设置GPU,导入库2.导入数据3.查看数据 **二、数据预处理**1.加载数据2.可视化数据3.配置数据集 **三、构建CNN网络模型**1、手动搭建2、直接调用官方模型 **四、编译模型****五、训练模型****六、模型评估****七、预测**八、暂时总结…

Spring-容器:IOC-基于注解管理Bean

目录 一、基于注解管理Bean&#xff08;重点&#xff09;1.1、概述1.2、开启组件扫描1.2.1、指定要排除的组件1.2.2、仅扫描指定组件 1.3、使用注解定义Bean1.4、使用Autowired注入1.4.1、属性注入1.4.2、set注入1.4.3、构造方法注入1.4.4、形参注入1.4.5、无注解注入1.4.6、联…

自幂数判断c++

题目描述 样例输入 3 152 111 153样例输出 F F T 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; long long m,a; int main(){cin>>m;for(int i1;i<m;i){cin>>a;long long ta,n[10],cc0,s0;while(t!0){//求位数与拆位n[cc]t%10;tt/…

报错:Reached the max session limit(DM8 达梦数据库)

报错:Reached the max session limit - - DM8 达梦数据库 1 环境介绍2 数据库启动SYSTEM IS READY后面日志3 数据库刚启动日志4 达梦数据库学习使用列表 1 环境介绍 某项目无法连接数据库,报错:超过最大会话数限制 , 检查 dmdba ulimit -a openfiles 已改检查 dm.ini 其中 MAX…

中间代码例题

答案&#xff1a;D 知识点&#xff1a; 中间代码是一种简单且含义明确的记号系统&#xff0c;可以有若干形式&#xff0c;它们的共同特征是与机器无关。 最常见的中间代码有&#xff1a;后缀式&#xff0c;语法树&#xff0c;三地址码&#xff0c;四元式 这些往往是数据&am…

迪普防火墙接口故障处理

一、防火墙故障初查 一台捷普防火墙&#xff0c;突然间业务不通&#xff0c;接口UP&#xff0c;策略正常&#xff0c;区域正常&#xff0c;互联地址就是不能ping通。 如上&#xff0c;接口状态很正常。 如上&#xff0c;互联设备ping不通。 二、锁定故障问题点 检查arp表&…

卷轴模式系统APP源码之产品分析:探索其设计精髓与市场潜力

在移动互联网的浪潮中&#xff0c;各类创新应用层出不穷&#xff0c;其中&#xff0c;“卷轴模式系统APP”作为一种融合了传统文化元素与现代交互设计的产品&#xff0c;正逐渐引起市场的关注。本文将从产品设计的角度&#xff0c;深入分析卷轴模式系统APP的源码特性、用户体验…

CVPR 2024最新论文分享┆YOLO-World:一种实时开放词汇目标检测方法

论文分享简介 本推文主要介绍了CVPR 2024上的一篇论文《YOLO-World: Real-Time Open-Vocabulary Object Detection》&#xff0c;论文的第一作者为Tianheng Cheng和Lin Song&#xff0c;该论文提出了一种开放词汇目标检测的新方法&#xff0c;名为YOLO-World。论文通过引入视觉…

思科IP访问控制列表4

#网络安全技术实现# #任务四命名访问控制列表的控制4# #1配置计算机的IP 地址、子网掩码和网关 #2配置Router-A的主机名称及其接口IP地址 Router>enable Router#conf t Router(config)#hostname Router-A Router-A(config)#int g0/1 Router-A(config-if)#ip add 192.1…

如何在算家云搭建Flux.1(AI绘画)

一、Flux.1简介 Flux.1 是黑森林实验室发布的 AI 绘图模型&#xff0c;也可以说是 SD 的原班人马打造。其表现出的效果已经超越了 SD3、DALLE3(HD)和 Midjourney v6.0&#xff0c;具有强大的出图能力&#xff0c;相比 SD3 拥有更优秀的提示词理解能力&#xff0c;更强的文字生…

内网渗透—横向移动非约束委派约束委派

前言 今天依旧是横向移动的内容&#xff0c;委派主要分为三类非约束委派、约束委派、资源委派。今天主要讲前面两个内容&#xff0c;资源委派留到最后再讲。 实验环境 Web&#xff1a;192.168.145.137&#xff0c;192.168.22.28 DC&#xff1a;192.168.22.30 非约束委派 原…

6.科学计算模块Numpy(3)对ndarray数组的常用操作

引言 众所周知&#xff0c;numpy能作为python中最受欢迎的数据处理模块&#xff0c;脱离不了它最核心的部件——ndarray数组。那么&#xff0c;我们今天就来了解一下numpy中对ndarray的常用操作。 通过阅读本篇博客你可以&#xff1a; 1.掌握ndarray数组的切片和copy 2.学会…

wx.chooseMessageFile在pc端微信小程序失效解决方法

项目场景&#xff1a; 在uniapp上驱动微信开发者工具&#xff08;下图&#xff09; 在手机上和微信开发者工具中&#xff08;图1&#xff09;都可以上传成功&#xff0c; 打开pc端的微信小程序 在pc端打开小程序时点击上传没反应 问题描述 提示&#xff1a;这里描述项目中遇到…

css实现卡片右上角的状态

1、成品展示 2、html部分 <div class"itemBox"><div class"status">{{ statusList[item.status] }}</div> </div> 3、css部分 .itemBox {position: relative;overflow: hidden; } .status {height: 25px;line-height: 25px;bac…

ISO26262 功能安全对设计的要求以及评判安全等级的主要参数

ISO 26262 标准规定了道路车辆功能安全的相关要求&#xff0c;不同 ASIL 等级对控制器在设计、安全机制、验证确认和文档记录等方面有不同要求。高 ASIL 等级的控制器需满足更高的硬件和软件设计标准&#xff0c;具备更强的故障检测、诊断、容错和恢复能力&#xff0c;进行更严…

电脑回收站被清空,怎么恢复丢失数据?

回收站&#xff0c;这个看似不太起眼的电脑功能&#xff0c;实际上在关键时刻能够为我们挽回重大损失&#xff0c;帮助我们重新获得至关重要的文件和数据。对于经常与电脑打交道的朋友们来说&#xff0c;当某个文件被不小心删除时&#xff0c;回收站往往成为我们文件找回和恢复…

Vue 项目hash和history模式打包部署与服务器配置

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 在开发 Vue 项目时&#xff0c;Vue Router 提供了两种模式来创建单页面应用&#xff08;SPA&#xff09;的 URL&#xff1a;hash 模式和 history 模式。 简单说下两者的主要区别&#xff1a; hash 模式下的…

2024 年高教社杯全国大学生数学建模竞赛B题—生产过程中的决策问题(讲解+代码+成品论文助攻)

2024数学建模国赛选题建议团队助攻资料-CSDN博客https://blog.csdn.net/qq_41489047/article/details/141925859本次国赛white学长团队选择的是比较擅长的BC题&#xff0c;选题建议和助攻资料可参见上面这篇博文&#xff0c;本篇博文主要介绍B题—生产过程中的决策问题&#xf…

反转二叉树(递归非递归解决)

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 方法一&#xff1a;递归解法 递归是处理树结构问题的常用方式&#xff0c;二叉树的问题通…

【RLHF】浅谈ChatGPT 等大模型中的RLHF算法

本文收录于《深入浅出讲解自然语言处理》专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅!​个人主页:有梦想的程序星空​个人介绍:小编是人工智能领域硕士,全栈工程师,深耕Flask后端开发、数据挖掘、NLP、Android开发、自动化等领域,有较丰…