如何编写单个Makefile同时编译生成两个C语言可执行程序
Makefile 实现单次编译生成两个 C 可执行程序方案
核心逻辑是将 Makefile 的第一个默认目标设为all,让它依赖你需要生成的两个可执行文件,执行make时就会自动完成两个程序的编译链路。
示例文件结构
假设你的项目源码如下:
- 第一个可执行程序
app1对应源码app1.c,依赖公共模块common.c - 第二个可执行程序
app2对应源码app2.c,依赖公共模块common.c
完整通用版 Makefile
# 定义使用的编译器 CC = gcc # 定义编译参数,按需调整,这里开警告、加调试信息 CFLAGS = -Wall -g # 声明要生成的两个可执行文件名 TARGETS = app1 app2 # 默认目标,依赖两个最终可执行文件,执行完即完成全量编译 all: $(TARGETS) # app1 的编译链接规则 app1: app1.o common.o $(CC) $(CFLAGS) -o $@ $^ # app2 的编译链接规则 app2: app2.o common.o $(CC) $(CFLAGS) -o $@ $^ # 通用规则:所有 .c 文件编译为对应的 .o 目标文件 %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ # 清理规则:删除所有中间文件和可执行程序 clean: rm -f *.o $(TARGETS)
其中用到的 Makefile 自动变量含义:
$@:代指当前规则的目标文件(比如app1、app2、生成的.o文件)$^:代指当前规则的所有依赖文件$<:代指当前规则的第一个依赖文件
注意:Makefile 中每个规则的命令行开头必须用Tab缩进,不能用空格,否则会触发语法报错。
简化版(无公共依赖源码场景)
如果两个可执行程序都只依赖自身对应的单个.c文件,没有其他公共依赖,可以直接利用Makefile的隐式规则,简化写法如下:
CC = gcc CFLAGS = -Wall -g TARGETS = app1 app2 all: $(TARGETS) clean: rm -f *.o $(TARGETS)
使用方法
- 直接在Makefile所在目录执行
make,即可一次性编译生成两个可执行程序 - 执行
make clean可清理所有编译生成的中间文件和最终可执行文件 - 若只需生成单个可执行程序,比如只要app1,执行
make app1即可
内容的提问来源于stack exchange,提问作者Im not a robot
相关产品推荐
相关产品推荐

