首页 > 其他分享 >Makefile教程(Makefile的结构)

Makefile教程(Makefile的结构)

时间:2023-06-11 19:03:52浏览次数:40  
标签:test1 教程 make Makefile 命令 func 执行 hello 结构

(文章目录)


前言

一、Makefile的结构

Makefile 通常由一系列规则组成,每条规则定义了如何从源文件生成目标文件。每个规则又由目标、依赖和命令三部分组成。

下面是 Makefile 规则的基本结构:

target: dependencies
    command1
    command2
    ...

其中,target 是要生成的目标文件名,dependencies 是生成目标文件所依赖的文件或目录,而 command1、command2 等则是生成目标文件所需执行的命令。

例如,以下的规则:

hello: hello.c
    gcc -o hello hello.c

指定了一个规则,用于将 hello.c 编译成可执行文件 hello。其中,hello 是目标文件名,hello.c 是依赖的源文件名,而 gcc 则是生成目标文件所需要的命令。注意,在命令行中,我们需要使用 tab 而非空格来缩进命令行。

首先我们先编写一个hello.c:

#include <stdio.h>

int main(void)
{
    printf("Hello World\n");

    return 0;
}

执行make命令: 在这里插入图片描述 ls查看生成的文件: 这里可以看到生成了一个hello可执行文件。 在这里插入图片描述 执行hello可执行文件: 在这里插入图片描述

二、深入案例

这个 Makefile 有一个 all 目标,依赖于 test1 目标。all 目标包含一行命令 echo hello world,用于输出字符串 "hello world"。test1 目标没有依赖关系,包含一行命令 echo test1,用于输出字符串 "test1"。

当我们执行 make 命令时,make 会首先查找 Makefile 文件,并读取 all 目标。因为 all 目标依赖于 test1 目标,因此 make 会接着查找 test1 目标,并执行其命令。在 test1 的命令执行完成后,make 会回到 all 目标,并执行其命令,即输出字符串 "hello world"。

all : test1
	echo hello world

test1 : 
	echo test1

因此,make 命令的输出结果如下: 在这里插入图片描述

三、Makefile中的一些技巧

在命令前面加上@可以不显示出执行的命令:

all : test1
	@echo hello world

test1 : 
	@echo test1

执行结果; 这里我们可以看到执行make后没有显示出执行的命令。 在这里插入图片描述

将all和最终可执行文件名放在makefile的第一个目标里面:

hello all : hello.o func.o
	gcc -o hello hello.o func.o

hello.o : hello.c
	gcc -c -o hello.o hello.c

func.o : func.c
	gcc -c -o func.o func.c

对应文件代码: hello.c:


extern void func(void);

int main(void)
{
    func();

    return 0;
}

func.c:

#include <stdio.h>

void func(void)
{
    printf("Hello World\n");
}

执行make命令: 在这里插入图片描述 再次执行make命令: 在这里插入图片描述 我们发现这里执行第二次make命令的时候会告诉我们hello已经是最新的了,那么就不会再次进行编译执行了。

在执行Make命令时,Make会根据规则的依赖关系判断哪些规则需要重新执行以及哪些规则可以跳过。

如果Make发现生成目标的依赖文件没有更新,那么就没有必要重新生成目标文件。因此,Make会跳过这条规则,并且不执行规则中的命令。只有当目标依赖关系中的某个文件发生了变化,才会导致相关规则和命令的重新执行。

这种依赖关系可以有效地提高Make的构建效率,避免不必要的重复构建。当你修改了源代码文件时,Make会自动检测出需要重新构建的目标,并生成最新的可执行文件或静态库。

那么加上all又可以起到什么作用呢:

使用make all命令: 在这里插入图片描述 当执行make all时make程序会自动寻找到makefile中的all目标进行执行。

总结

本篇文章主要讲解了makefile的结构和一些小技巧,希望大家能够好好理解并掌握。

标签:test1,教程,make,Makefile,命令,func,执行,hello,结构
From: https://blog.51cto.com/u_16153875/6458550

相关文章

  • Makefile教程(入门介绍)
    (文章目录)前言本篇文章将带大家学习Makefile,Makefile在文件的编译中起到重要作用,在Linux中我们也是经常使用到Makefile,下面我将会带大家学习什么是Makefile。一、Makefile介绍Makefile是用于自动化构建程序的一种工具,它通常被用于编译,连接以及打包程序等任务。Makefile利用了......
  • 9.20 图形结构
    定义类Shape,用来表示一般二维图形。Shape具有抽象方法area()和perimeter(),分别用来计算形状的面积和周长。试定义一些二维形状类(如矩形、三角形、圆形、椭圆形等),这些类均为Shape类的子类。abstractclassAbstractShape{ publicabstractdoublearea();//求面积 publicab......
  • 软件测试|数据分析神器pandas教程(一)
    前言Python是非常适合用于数据分析的,除了Python代码简单以外,Python还有非常多的第三方库,对于数据分析有很大帮助,今天我们就介绍一下Python进行数据分析的神器——pandas。安装从2019年1月1号开始,新发布的pandas将只支持Python3版本,所以我们的教程也以python3.7为例进行演示。......
  • 软件测试|数据分析神器pandas教程(二)
    前言上一篇文章我们介绍了pandas的安装,并且写了一个简单的示例,本篇文章我们就开始学习pandas的数据结构。数据结构-SeriesPandasSeries类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。Series由索引(index)和列组成,函数如下:pandas.Series(data,index,dtyp......
  • ELK logstash 结构
    在命令行中指定-e参数,从标准输入到标准输出,并格式化结果。#/opt/logstash/bin/logstash-e'input{stdin{}}output{stdout{codec=>rubydebug}}'www.ttlsa.comSettings:Defaultfilterworkers:2Logstashstartupcompleted{"message"=>"www.ttlsa.co......
  • 通过 docker-compose 快速部署 Azkaban 保姆级教程
    目录一、概述二、Azkaban的调度流程三、前期准备1)部署docker2)部署docker-compose四、创建网络五、Azkaban编排部署1)安装MySQL2)下载Azkaban编译3)初始化azkaban用户和表4)配置5)启动脚本bootstrap.sh6)构建镜像Dockerfile7)编排docker-compose.yaml8)开始部署六、简单测试验......
  • 软件测试|web自动化测试神器playwright教程(十五)
    前言我们在日常工作中,会经常遇到弹出警告框的问题,弹框无法绕过,必须处理才可以执行后续的测试,所以弹框处理也是我们必须掌握的一个知识。弹框通常分为3种,分别为alert,confirm,promot。alert弹框:只有信息和确定按键confirm弹框:在alert弹窗基础上增加了取消按钮prompt弹框:在confirm的基......
  • 软件测试|web自动化测试神器playwright教程(十六)
    前言在我们的日常工作中,经常会遇到文件下载的事件,如下图:我们可以看到在下载文件时会弹出一个Windows对话框,我们知道,selenium只能操作web页面,无法操作Windows对话框,使用selenium时,我们可以借助autoit等工具实现该功能。playwright则可以不借助其他工具实现文件的下载。文件下载playw......
  • 【数据结构】查找
    基本概念查找表 由同一类型的数据元素(记录)构成的集合。所谓集合指记录间不存在前驱后继关系,因此查找表是一种应用灵便的结构。静态查找表 只对查找表做查找操作,即只查询某个记录是否在表中,或只检索某个记录的各种属性。或者说:查找表加上不会使该表的内容发生变化的查找操作,称作......
  • MySQL Workbench的使用教程
        MySQLWorkbench是MySQLAB最近释放的可视数据库设计工具。这个工具是设计MySQL数据库的专用工具。MySQLWorkbench拥有很多的功能和特性;这篇由DjoniDarmawikarta写的文章通过一个示例展现了其中的一些。我们将针对一个订单系统建立一个物理数据模型,这里的订单......