如何通过Make将所有目标文件统一存放在同一目录下?
解决方法
直接用下面的Makefile就能实现把所有目标文件存到build根目录的需求,同时解决你遇到的目录不存在错误:
# 编译器与编译参数 CC = gcc CFLAGS = -O0 -I. -I./include -Wall LDFLAGS = -lm # 列出所有源文件 SRCS = src/main.c lib/func.c # 把每个源文件转换成build目录下的目标文件(去掉原路径,只保留文件名) OBJS = $(patsubst %.c, build/%.o, $(notdir $(SRCS))) # 最终生成的可执行文件名称 TARGET = myapp all: $(TARGET) # 链接生成可执行文件 $(TARGET): $(OBJS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) # 编译src目录下的源文件到build目录 build/%.o: src/%.c | build $(CC) $(CFLAGS) -c -o $@ $< # 编译lib目录下的源文件到build目录 build/%.o: lib/%.c | build $(CC) $(CFLAGS) -c -o $@ $< # 确保build目录存在(编译前自动创建) build: mkdir -p $@ # 清理生成的文件 clean: rm -rf build $(TARGET)
核心要点说明
$(notdir $(SRCS)):去掉源文件的路径前缀,比如src/main.c会变成main.c$(patsubst %.c, build/%.o, ...):把处理后的文件名转换成build/xxx.o格式,确保所有目标文件都直接放在build目录下| build:这是顺序依赖规则,强制make先执行build目录的创建命令,避免因目录不存在导致的编译错误- 两个
build/%.o规则:分别匹配src和lib目录下的源文件,让make能找到对应的.c文件来生成目标文件
你之前出错的原因
你之前的规则试图生成build/src/main.o,但build/src这个子目录不存在,make不会自动创建嵌套子目录(除非你显式写规则)。上面的写法直接把目标文件输出到已创建的build根目录,从根源避免了这个问题。
内容的提问来源于stack exchange,提问作者med amine riahi
相关产品推荐
相关产品推荐

