自动构建之Makefile

news/2024/10/18 7:49:08/

链接: 自动构建之CMake

Makefile

Makefile是用于自动化构建软件项目的工具,Makefile的优点是简单、直接,可以直接使用make工具进行构建。但是,Makefile通常需要手动编写和维护,可能会导致跨平台和跨编译器的兼容性问题。

Makefile文件

all:@echo "hello all"
test:@echo "hello test"

make默认执行第一个任务,也就是all

也可以指定执行,例如make test
在这里插入图片描述
Makefile通常包含以下几个部分:

  • 变量:用于存储文件名、编译器选项等信息。
  • 规则:定义了如何从源文件生成目标文件,包括编译、链接等操作。
  • 依赖关系:指定目标文件依赖于哪些源文件,以确保在源文件发生更改时重新构建目标文件。
  • 命令:实际执行的编译、链接等操作。

依赖

all:test@echo "hello all"
test:@echo "hello test"

上述文件中,all就依赖于test,会先执行test,再执行all

在这里插入图片描述

多文件形式
在这里插入图片描述

Makefile内容

.PHONY: main clean
simple: main.o foo.ogcc -o simple main.o foo.o
main.o: main.cgcc -o main.o -c main.c
foo.o: foo.cgcc -o foo.o -c foo.c
clean:rm simple main.o foo.o

其中.PHONY是做伪目标作用

可以看到,simple:依赖于main.o foo.o;其中main.o依赖于main.c文件,foo.o依赖于foo.c文件(这两个依赖可以不用写,但是simple的依赖必须写,因为simple的任务执行前必须要先执行生成main.o和foo.o)

在这里插入图片描述

makefile文件执行的时候会检查目标任务结果是否有更新,如果代码没有更新的话,那么make是会不会重复再执行任务。

在这里插入图片描述

变量

.PHONY: clean
CC = gcc
RM = rm
EXE = simple
OBJS = main.o foo.o
$(EXE): $(OBJS)$(CC) -o $(EXE) $(OBJS)
main.o: main.c$(CC) -o main.o -c main.c
foo.o: foo.c$(CC) -o foo.o -c foo.c
clean:$(RM) $(EXE) $(OBJS)

自动变量

$@
$^
$<

在这里插入图片描述
在这里插入图片描述

可以看到其中

$@所指的是其中命令被运行的目标任务名称

$^则表示的是规则中的所有依赖条件。
$<表示的是规则中的第一个依赖条件。

通配符

采用变量加通配符等,可以实现自适应编译的操作。

假如文件分布

在这里插入图片描述

Makefile内容

.PHONY: clean
CC = gcc
RM = rm
EXE = simple
#SRCS = main.c foo.c
SRCS = $(wildcard *.c) #wildcard 是通配符函数,可以找到所有的.c文件
#SRCS = foo.c foo2.c main.c
OBJS = $(patsubst %.c,%.o,$(SRCS))#patsubst 是字符串替换函数,把.c换成对应的.o
#OBJS = foo.o foo2.o main.o
$(EXE): $(OBJS)$(CC) -o $@ $^
%.o: %.c  #% 也是匹配符$(CC) -o $@ -c $^
clean:$(RM) $(EXE) $(OBJS)
src: # 测试make src显示相应的xx.c@echo $(SRCS)
objs:# 测试make objs显示相应的xx.o@echo $(OBJS)

其中%是匹配符https://blog.csdn.net/BobYuan888/article/details/88640923

make执行结果:

在这里插入图片描述

此时假如我增加一个foo3函数,可以不更新Makefile文件,仍然可以编译成功

在这里插入图片描述


http://www.ppmy.cn/news/86571.html

相关文章

adb 命令速查(下)

ADB 关于APP安装、调试和monkey压力测试 作者&#xff1a;炭烤毛蛋 &#xff0c;查看博主了解更多。 提示&#xff1a;承接上篇《adb 命令速查(中)》&#xff0c;本文将 文章目录 ADB 关于APP安装、调试和monkey压力测试7 adb 关于 apk 的相关操作7.1 安装 apk普通安装带有命…

虹科HiveMQ与MQTT:构建互联汽车的新架构

前言 随着汽车的互联程度越来越高&#xff0c;汽车制造商和互联汽车平台提供商通过使用物联网技术&#xff0c;提供新服务并从车辆收集有价值的遥测数据&#xff0c;以此来增加营收。从高效的车队管理和汽车共享到预测性维护和高级驾驶员辅助系统&#xff0c;未来移动出行的可…

uniapp内使用 mescroll

前言 在使用uniapp开发项目的过程中&#xff0c;在很多场景里都需要下拉刷新和上拉加载&#xff0c;而 mescroll.js 则是一个非常精致的下拉刷新和上拉加载 js 框架。 官网地址&#xff1a;mescroll 介绍 mescroll.js 是在 H5端 运行的下拉刷新和上拉加载插件&#xff0c;时…

windows解决python安装django架构没有django-admin命令

目录 一.尝试安装与配置 1.直接pip命令安装 2.用pycharm测试 3.官网下包安装 二.解决 1.找到django安装的路径 2.配置系统变量 3.测试创建项目 3.1.执行访问页面 3.2.解决 3.3.继续测试 4.pycharm打开 一.尝试安装与配置 1.直接pip命令安装 pip install django dja…

Java 基础语法学习笔记

目录 一、Java语言概述 1.1 Java 的出现 1.2 Java的主要特性 1.3 Java语言的特点 1.4 Java语言的核心机制 1.5 Java语言的环境搭建 二、第一个Java程序 2.1 需要注意的问题 2.2 注释&#xff08;comment) 2.3 注意点&#xff1a; 2.4 Java API 的文档 2.5 第一个 Jav…

【Leetcode60天带刷】day02—— 977.有序数组的平方、209.长度最小的子数组、 59.螺旋矩阵II

题目&#xff1a;997.有序数组的平方 Leetcode原题链接&#xff1a;997.有序数组的平方——力扣 思考历程与知识点&#xff1a; 题目的意思很简单&#xff0c;就是把每个数的平方&#xff0c;按从小到大的顺序排个序&#xff0c;再输出出来。 第一想法是先每个数平方一遍&a…

关系数据库设计理论

关系数据库设计理论 目录 关系数据库设计理论是什么函数依赖完全函数依赖(Full Functional Dependency)部分函数依赖(Partial Functional Dependency)传递函数依赖(Transitive Functional Dependency) 异常插入异常(Insertion Anomaly)更新异常(Update Anomaly)删除异常(Deleti…

03 面向对象(多态,接口)

如果要求程序员必须在某个类中特定的方法中实现一个特定的功能, 应该如何实现? 使用抽象方法或者使用接口(interface) 抽象方法只能单继承,不能多继承,子类必须使用里面的抽象方法 接口可以多继承,实现类必须重写里面的方法 接口的作用? 接口是一种约定的规范,体现了规范…