You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:15:00