自动构建之Makefile

news2025/1/20 16:30:56

链接: 自动构建之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.o
	gcc -o simple main.o foo.o
main.o: main.c
	gcc -o main.o -c main.c
foo.o: foo.c
	gcc -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.coloradmin.cn/o/556030.html

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

相关文章

【SVN内网穿透】远程访问Linux SVN服务

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

.Net Core 数据校验框架使用

为了提高响应速度和界面可用性&#xff0c;一般在客户端都会对用户填写的数据进行校验&#xff0c;这样不需要把数据发送到服务端&#xff0c;用户就知道数据填写错误。但是也不能完全依赖客户端的校验&#xff0c;不仅因为恶意用户可以绕过客户端校验直接向服务器发送请求&…

YOLOv5区域检测+声音警报

YOLOv5区域检测声音警报 1. 相关配置2. 检测区域设置3. 画检测区域线&#xff08;不想显示也可以不画&#xff09;4. 报警模块5. 代码修改5.1 主代码5.2 细节修改&#xff08;可忽略&#xff09; 6. 实验效果 本篇博文工程源码下载 链接1&#xff1a;https://github.com/up-up-…

图片模块封装

图片模块封装 一.如何更换图片框架二.Glide配置1.依赖&#xff1a; 三.策略模式构建者模式图片框架搭建1.ImageOptions图片参数设置2.IImageLoader接口以及实现子类3.图片加载策略4.ImageLoader5.ImageLoaderManager6.使用:四.Bitmap三级缓存二次采样五.长图大图处理 一.如何更…

华为OD机试真题 Java 实现【任务混部】【2023Q1 200分】

一、题目描述 公司创新实验室正在研究如何最小化资源成本&#xff0c;最大化资源利用率&#xff0c;请你帮他们解决一个任务混部问题&#xff1a; 有taskNum项任务&#xff0c;每个任务有开始时间&#xff08;startTime &#xff09;&#xff0c;结束时间&#xff08;endTime…

Linux系统之cut命令的基本使用

Linux系统之cut命令的基本使用 一、cut命令介绍1. cut命令简介2.cut命令的由来 二、在Linux中命令帮助1. cut的help帮助信息2. cut的选项 三、cut的基本使用1. 指定字段的内容2. 使用分隔符打印文本内容3. 显示行中指定范围的字符 四、cut命令的日常使用1. 提取IP地址2. 提取本…

position:sticky-粘性吸附布局

一、描述 就是在一个滚动的容器里,将一个子元素设置为postion:sticky 在元素显示在可视区域内,显示的效果与position:relative 一致&#xff0c;当元素被滑动出可视区域外是,显示效果与position:fixed一致 二、注意事项 1、父元素需要存在滚动&#xff08;overflow:auto&…

快速入门Springboot整合Datagpa操作数据库

简介SpringDatagpa Spring Data JPA是Spring Data家族的一部分&#xff0c;可以轻松实现基于JPA的存储库。 . JPA是ORM规范&#xff0c;Hibernate是JPA规范的具体实现&#xff0c;这样的好处是开发者可以面向JPA规范进行持久层的开发&#xff0c;而底层的实现则是可以切换的。S…

day5 套接字属性设置

选项的级别 SOL_SOCKET 该级别的选项只作用于套接字本身 SOL_LRLMP 该级别的选项作用于IrDA协议 IPPROTO_IP 该级别的选项作用于IPv4协议 IPPROTO_IPV6 该级别的选项作用于IPv6协议 IPPROTO_RM 该级别的选项作用于可靠的多播传输 IPPROTO_TCP 该级别的选项适用于流式…

信道通信基础 - 传输介质(双绞线、光纤)

文章目录 1 概述2 传输介质2.1 双绞线2.2 光纤 3 扩展3.1 网工软考真题 1 概述 2 传输介质 2.1 双绞线 双绞线&#xff1a;8 根铜导线每 2 根扭在一起&#xff08;百兆用 4 根&#xff0c;千兆必须用 8 根&#xff09;分类 2.2 光纤 光纤&#xff1a;利用光在 玻璃或塑料纤…

很长一段时间没有用Ubuntu,无法获得锁**,锁正由进程***持有

问题分析&#xff1a;意思就是有另一个进程占用了apt-get&#xff0c;因为Ubuntu锁的访问机制是互斥的&#xff0c;即同一时间只能允许一个进程占用&#xff0c;只需要将那个占用的进程强制删除掉就行了。 使用如下两条命令即可&#xff1a; sudo rm /var/lib/dpkg/lock-fron…

藏在大神们收藏夹里的实用工具类网站!

今天来给大家分享几个大神们推荐的&#xff0c;藏在收藏夹里的宝藏工具类网站 Toolfk https://www.toolfk.com/ 一款程序员的工具箱&#xff0c;里面包含非常多实用工具&#xff0c;不仅有各种程序相关功能&#xff0c;还有很多不懂程序人也能用的简易功能。PHP在线加密工具、…

docker-compose 搭建maven私服 nexus与配置

目录 创建文件目录 docker-compose.yml文件 登录 配置 创建阿里云代理仓库 配置仓库顺序 maven配置文件setting.xml配置 本地jar包部署 在linux上搭建 创建文件目录 mkdir -p /apps/minio/{config,data,logs} 赋权限 chmod -R 777 data docker-compose.yml文件 version…

按键中断实验和串口中断实验

目录 【1】按键中断实验 【2】串口中断实验 【1】按键中断实验 实验要求&#xff1a;STM32上电LED&#xff08;PB0&#xff09;灯灭 &#xff0c;当检测到按键&#xff08;PA8&#xff09;按下时处理中断事件&#xff0c;变量i 扩展&#xff1a;知识点 响应优先级-》在两个中断…

Camtasia2023简体中文版屏幕录像 支持MP4/AVI/WMV等多种格式

在现在的网络互联网时代&#xff0c;越来越多的人走上了自媒体的道路。有些自媒体人会自己在网络上录制精彩视频&#xff0c;也有一些人会将精彩、热门的电影剪辑出来再加上自己给它的配音&#xff0c;做成大家喜欢看的电影剪辑片段。相信不管大家是自己平时有独特的爱好也好、…

TOGAF架构开发方法—ADM 架构需求管理

一、目标 需求管理阶段的目标是&#xff1a; 确保需求管理流程持续运行&#xff0c;并在所有相关的 ADM 阶段运行管理在 ADM 周期或阶段的任何执行期间确定的架构要求确保在执行阶段时&#xff0c;每个阶段都可以使用相关的体系结构要求 二、输入 需求管理阶段的输入包括&am…

Bean作用域、生命周期

bean作用域如何设置行为模式Bean的生命周期 bean作用域 Bean 的作用域指bean在spring框架的某种行为模式&#xff1b;bean的6种作用域分别是以下&#xff1a; 1&#xff1a;单例&#xff08;Singleton&#xff09;作用域 2&#xff1a;原型&#xff08;Prototype&#xff09;作…

chatgpt赋能Python-python_chardet

Python Chardet: 自动识别文件编码的利器 Python Chardet 是一个用于自动识别文件编码的工具&#xff0c;它基于最新的编码库&#xff0c;可以自动检测多种编码类型。在今天的多语言互联网时代&#xff0c;我们经常需要处理各种编码类型的文件&#xff0c;例如&#xff1a;爬虫…

chatgpt赋能Python-python_calc

介绍 Python Calc 是一款基于 Python 编程语言开发的计算器应用程序。它具备简单易用、功能强大、可扩展性强等特点&#xff0c;广泛应用于数据科学、机器学习、人工智能等领域。 Python Calc 提供了基本算术运算、三角函数、指数函数、对数函数等常用数学运算&#xff0c;同…