玩转Makefile | 一次编译多个目标

简介: 玩转Makefile | 一次编译多个目标


1. 使用场景


本教程所介绍的Makefile不太适用于企业级项目,适用于我们平时练习时编写小代码而快速编译的场景。具体来讲,是这样的场景:


我们平时看书或教程时,里面讲到的一些案例我们想实操一下,这类的案例一般比较短小,经常一个.c文件就足矣。如果针对每个小程序都编写一个Makefile那就显得有些麻烦,或者不编写Makefile,那就要手动敲一串gcc编译命令,会影响学习效率。


于是我们就有这种需求:在一个文件夹下面有多个.c文件,分别对应一个小程序,而总共只有一个Makefile,只要一个make命令就可以把这些程序全部编译一遍。并且,再往里面增加小程序时,make一下也可以编译这个新增的程序。


本篇教程就是为了实现这个需求而编写的Makefile。


2. 编写思路


1. 我们将文件夹下每个.c文件都视为一个程序,编译出来程序的名字(目标)与.c文件的文件名相同(去掉.c后缀),比如app1.c编译出来的程序为app1。实现这个目的的Makefile片断为:


SOURCE = $(wildcard *.c)  

TARGETS = $(patsubst %.c, %, $(SOURCE))  

2. 每个.c文件独立编译为一个目标,如果直接手写的话,对应的命令类似为:


gcc app1.c -o app1  

   gcc app2.c -o app2  

   gcc test.c -o test  


这样的命令可以抽象为一个,即:


$(TARGETS):%:%.c  

   $(CC) $< $(CFLAGS) -o $@  


TARGETS即为app1, app2, test,依赖为%:%c,这是一个模式变量,表示与目标相同的.c文件,即:


app1:app1.c  

   app2:app2.c  

   test:test.c  


有了这两个思路后,Makefile就可以补充完整了。完整的代码可以在公众号内回复mk2获取。


文件夹内容如下:


image.png


完整Makefile为:


SOURCE = $(wildcard *.c)  
TARGETS = $(patsubst %.c, %, $(SOURCE))  
CC = gcc  
CFLAGS = -Wall -g  
all:$(TARGETS)  
$(TARGETS):%:%.c  
    $(CC) $< $(CFLAGS) -o $@  
.PHONY:clean all  
clean:  
    -rm -rf $(TARGETS)

 

编译完成后文件夹内容为:


image.png

目录
相关文章
|
存储 算法 Linux
【Linux 应用开发 共享内存】深入理解和实践 ftruncate:共享内存的有效管理
【Linux 应用开发 共享内存】深入理解和实践 ftruncate:共享内存的有效管理
490 5
|
存储 芯片
第六章 半导体存储器【微机原理】2
第六章 半导体存储器【微机原理】2
1383 0
|
Linux C语言
Linux内核学习(七):linux kernel内核启动(一):概述篇
Linux内核学习(七):linux kernel内核启动(一):概述篇
212 0
|
11月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
595 0
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
783 4
|
存储 NoSQL Linux
深入理解Linux内核task_struct结构
深入理解Linux内核task_struct结构
|
Ubuntu Linux
内核实验(六):使用misc框架,实现简单字符设备驱动
本文介绍了如何使用Linux的misc框架来实现一个简单的字符设备驱动程序,包括编写驱动源码、编译、部署以及在Qemu虚拟机中测试驱动程序,展示了如何动态分配次设备号并手动创建设备文件以进行测试。
271 0
内核实验(六):使用misc框架,实现简单字符设备驱动
|
存储 编译器 数据处理
栈溢出及解决方法
栈溢出及解决方法
|
Linux 编译器 数据处理
探索Linux命令之nm:解析二进制文件的神器
`nm`命令是Linux下分析二进制文件的工具,显示符号表中的函数、变量等信息及它们的地址和类型。它帮助理解程序结构、调试和优化,支持不同符号类型、输出选项和过滤。常用参数如`-a`显示所有符号,`-t f`列出定义的函数。在实际应用中,可以结合其他工具如`objdump`、`readelf`进行更深入的分析,并注意备份原始文件。
|
Java Linux 开发工具
Linux部署 Gerrit 教程 ——2023.07
Linux部署 Gerrit 教程 ——2023.07
918 0