首页 > 系统相关 >Linux项目自动化构建工具-Makefile简介

Linux项目自动化构建工具-Makefile简介

时间:2024-08-08 14:54:58浏览次数:16  
标签:文件 study01 iZf8z8jpr9io12vlyj7lcuZ 简介 make Makefile Linux proc

Makefile 是 Linux 环境下常用的一个自动化构建工具,它主要用于编译和构建项目。Makefile 文件描述了如何编译和链接程序,以及它们之间的依赖关系。使用 Makefile 可以简化编译过程,使得只需要重新编译那些自上次编译以来被修改过的文件,从而节省时间。

基本概念

  • 目标(Targets):Makefile 中的基本单位,通常代表一个可执行的程序或者一个对象文件。
  • 依赖(Dependencies):目标所依赖的文件列表,这些文件在目标之前被编译或处理。
  • 命令(Commands):用于生成目标的 shell 命令。

Makefile 规则

Makefile 中的规则定义了如何生成一个或多个目标文件。每条规则包含以下部分:

目标: 依赖...  
    命令  
    ...
  • 目标:通常是文件名,它可以是可执行文件或中间文件。
  • 依赖:生成目标所需要的文件列表。如果依赖的文件比目标文件新,则执行下面的命令来生成目标。
  • 命令:用于生成目标的 shell 命令,必须以 Tab 开始

简单示例:

假设你有一个简单的 C 程序,你想编译这些文件并生成一个可执行文件proc。

 但是这样每次再修改后都需要重新输入gcc -o proc proc.c

所以我们可以选择更加方便地Makefile.

[root@iZf8z8jpr9io12vlyj7lcuZ study01]# touch Makefile
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# vim Makefile
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# cat Makefile
proc:proc.c
	gcc -o proc proc.c
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# make
gcc -o proc proc.c
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# ls
Makefile  proc  proc.c
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# ./proc
hello Makefile
依赖关系
上面的文件proc ,它依赖 proc.c proc.c 是依赖文件列表
依赖方法
gcc -o proc proc.c,就是与之对应的依赖关系。 makefile本质是依赖关系与依赖方法的结合。 在Makefile中我们还可以加入其他内容:
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# cat Makefile
proc:proc.c
	gcc -o proc proc.c
.PHONY:clean
clean:
	rm -f proc

我们可以通过这种方法使用

[root@iZf8z8jpr9io12vlyj7lcuZ study01]# make clean
rm -f proc
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# ls
Makefile  proc.c

上面的Makefile中通过.PHONY命名一个伪目标clean(这个名字可以更改)。

原理

上面的Makefile更加完整应该是:

proc:proc.o
    gcc proc.o -o proc
proc.o:proc.s
    gcc -c proc.s -o proc.o
proc.s:proc.i
    gcc -S proc.i -o proc.s
proc.i:proc.c
    gcc -E proc.c -o proc.i
.PHONY:clean
clean:
    rm -f proc.i proc.s proc.o proc
make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么,
  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“proc”这个文件,并把这个文件作为最终的目标文件。
  3. 如果proc文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比proc这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成proc这个文件。
  4. 如果hello所依赖的proc.o文件不存在,那么make会在当前文件中找目标为proc.o文件的依赖性,如果找到则再根据那一个规则生成proc.o文件。(这有点像一个堆栈的过程)
  5. 当然,你的C文件和H文件是存在的啦,于是make会生成proc.o 文件,然后再用 proc.o 文件声明make的终极任务,也就是执行文件proc了。
  6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
  7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
  8. make只管文件的依赖性,即如果在找了依赖关系之后,冒号后面的文件还是不在,那么就不工作了。

其他

Makefile后面的命令内容可以是很多,比如:
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# vim Makefile
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# cat Makefile
proc:proc.c
	gcc -o proc proc.c
	echo "完成"
.PHONY:clean
clean:
	rm -f proc
	echo "删除完成"
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# make
gcc -o proc proc.c
echo "完成"
完成
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# ls
Makefile  proc  proc.c
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# make clean
rm -f proc
echo "删除完成"
删除完成

我们可以看见在make时会把命令名称本身也打印出来,我们可以在命令前加上'@'符号来关闭回显。

[root@iZf8z8jpr9io12vlyj7lcuZ study01]# make
完成
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# make clean
删除完成
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# 
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# make
完成
[root@iZf8z8jpr9io12vlyj7lcuZ study01]# make
make: `proc' is up to date.

我们在多次make会出现这样的情况,形成了可执行程序后再make,会被提示该可执行文件是最新的。

但是我们可以在proc前加入.PHONY:proc,这样每次make都可以执行。

这是因为.PHONY:让目标文件对应的方法总是被执行。 

那这是为什么呢?

对于源文件以及可执行程序,它们都是文件,文件由内容与属性构成,属性则包括时间,我们可以通过stat命令查看时间属性。

 其中:

  • Access表示该文件最近被访问的时间;
  • Modify表示该文件内容最近被修改的时间;
  • Change表示该文件属性最近被改变的时间。

在对属性进行修改后,Change时间发生了变化 。

在对proc.c内容进行修改后,Modify时间与Change时间都发生了改变,这是因为内容的改变可能也会改变文件大小等属性。

编译程序是否能被重新执行根据对比Modify时间,而.PHONY让取消其对于Modify时间的对比,所以可以使文件多次执行。

在改变文件属性后,未改变Modify时间,仅改变Change时间,所以仍无法重新多次make。 

标签:文件,study01,iZf8z8jpr9io12vlyj7lcuZ,简介,make,Makefile,Linux,proc
From: https://blog.csdn.net/2302_80190174/article/details/141017807

相关文章

  • 云服务器Linux Centos7 安装minio
    官网下载minio地址:https://min.io/download?license=agpl&platform=kubernetes本文章可放心无脑食用1.准备工作创建存储位置(一般在/usr/local下安装程序)mkdir/usr/local/miniomkdir/usr/local/minio/data/usr/local/minio:存放minio程序/usr/local/minio:存放mi......
  • Linux 硬件相关命令
    ※,Linux性能分析:https://www.cnblogs.com/bakari/p/10515977.html★,之CPU篇:cpu个数、核数、线程数是cpu的三个重要概念。一般个人PC上只有一个物理cpu,服务器上可以有多个物理cpu。一个物理cpu可以有多个核(比如4核,8核等等);一个物理核可以使用超线程技术超出多个虚拟核(即线程),一般是......
  • 初见linux
    一,  UNIX/Linux中一切皆文件!  /在linux中为分隔符,windows中\为分隔符。  注:在终端中除第一次出现的/被视作根目录往后皆是分隔。  eg:/usr/include/stdio.h其表示的意思是根目录下的usr目录中的include目录里的stdio.h文件。  /根目录  所有文件都在它下面 ......
  • 网卡与Linux网络结构(上)
    原本是想借着之前学习的中断进一步拓展到网卡与中断的,标题都写好了,结果低估了其中的知识面和难度。。。。。于是调整为了网卡与Linux网络结构(上),没错,仅仅只是上。。。我还是进一步低估了学习需要花费的时间,网络这块的确是弱项,以前都是死记硬背TCP的三次握手、四次挥手,这次正好......
  • linux 虚拟机有线网络消失解决方案汇总.18348485
    修复Linux虚拟机有线网络消失的解决方案汇总的一些操作(后续可能会更新)第一种方法:删除var/lib/NetworkManager/文件夹(自测Centos系统有用)1.打开终端,输入以下命令:cd/var/lib2.查询有无文件夹:findNetworkManager3.删除文件夹:rm-rfNetworkManager/4.重启。5.使......
  • 【北京迅为】《stm32mp157开发板嵌入式linux开发指南》第四章 Ubuntu 启用 root 用户
         iTOP-STM32MP157开发板是基于意法半导体STARM双Cortex-A7核加单Cortex-M4核的一款多核异构处理器。Cortex-A7内核提供对开源操作系统Linux的支持,借助Linux系统庞大而丰富的软件组件处理复杂应用。M4内核上运行对于实时性要求严格的应用。        开发板既有......
  • Linux中可怕的fork炸弹
    什么是Linux中的Fork炸弹Linux中的Fork炸弹(ForkBomb)是一种拒绝服务攻击的形式,它利用了操作系统中的“fork()”系统调用。Fork()系统调用用于创建新进程,该进程是调用进程的副本。Fork炸弹利用此系统调用创建大量的子进程,以消耗系统资源,例如内存和CPU时间,从而使系统不可用。要实......
  • windows平台中使用vscode远程连接linux进行c++开发配置教程(内容详细适合小白)-2021-3-3
    文章目录一、简要介绍二、软件安装步骤1.linux系统安装2.vscode安装3.ssh安装4.配置Remote-SSH5.安装远程插件6.简单小测试三、配置vscode开发环境1.默认设置、用户设置、远程设置和工作区设置2.c++开发设置a).c_cpp_properties.jsonb).tasks.jsonc).launc......
  • Linux shell脚本案例:使用正则表达式匹配目录并定时删除日期早于当前系统日期的所有目
    实现每周三和每周日执行清理/NFS目录的任务,你可以使用shell脚本结合cron定时任务。下面是一个示例脚本,它会删除/NFS目录下所有名称形如XBK_FULL_YYYYMMDDHHMMSS和XBK_INCR_YYYYMMDDHHMMSS的目录,其中日期早于当前系统日期。步骤1:创建Shell脚本创建脚本......
  • 离线win/mac下vscode客户端通过ssh连接linux服务器
    1、下载vscode,这个网上教程一大堆就不一一介绍了,自行百度建议安装蓝色的版本,最后图标是蓝色的。下载网址:VisualStudioCode-CodeEditing.Redefined2、win系统或mac系统安装openssh,这个也一大堆教程,可以自行百度3、安装vscode插件下载网址:ExtensionsforVisual......