如何使用Makefile隐式规则构建不在Makefile同级目录下的文件
嗨,这问题我熟!你只需要把config/file3.c也纳入你的构建目标列表里就行,给你两种实用的方案:
方案1:手动指定目标文件
这种方式适合文件数量固定的场景,直接把所有需要编译的.o文件列出来:
# 定义所有需要生成的目标文件,包含src和config目录下的 OBJS = src/file1.o src/file2.o config/file3.o # 最终的可执行文件(这里命名为myapp,你可以改成自己需要的名字) myapp: $(OBJS) $(CC) -o $@ $^ # 你原有的隐式规则保持不变 %.o: %.c $(CC) -c -o $@ $<
原理很简单:当Make需要构建config/file3.o时,它会自动找到对应的config/file3.c,然后套用你写的隐式规则完成编译,最后把所有.o文件链接成可执行文件。
方案2:自动扫描所有源文件
如果以后可能会新增更多.c文件,用这个更省心,借助Make的wildcard和字符串替换功能自动收集所有源文件:
# 自动扫描src和config目录下的所有.c文件 SRCS = $(wildcard src/*.c config/*.c) # 把所有.c后缀替换成.o,得到对应的目标文件列表 OBJS = $(SRCS:.c=.o) myapp: $(OBJS) $(CC) -o $@ $^ %.o: %.c $(CC) -c -o $@ $<
这样不管你在src或config目录下加多少.c文件,Make都会自动识别并编译,不用手动修改目标列表啦。
内容的提问来源于stack exchange,提问作者Ahmed Adel
相关产品推荐
相关产品推荐

