C Makefile:如何将所有.o文件放在一个目录中

C Makefile:如何将所有.o文件放在一个目录中,c,makefile,C,Makefile,我想将所有.o文件放在不同的目录中。 他可以创建所有的.o文件,但他可以创建.exe文件 我的生成文件: CC = gcc SRC = $(wildcard *.c) OBJ = $(SRC:.c=.o) EXEC = exe CFLAGS = -Wall -pedantic -std=c11 -g all : $(EXEC) %.o : %.c $(CC) -o prog/$@ -c $< $(CFLAGS) $(EXEC) : $(OBJ) $(CC) -o $@

我想将所有.o文件放在不同的目录中。
他可以创建所有的.o文件,但他可以创建.exe文件
我的生成文件:

CC = gcc
SRC = $(wildcard *.c)
OBJ = $(SRC:.c=.o)
EXEC = exe
CFLAGS = -Wall -pedantic -std=c11 -g


all : $(EXEC)
%.o : %.c
    $(CC) -o prog/$@ -c $< $(CFLAGS)
$(EXEC) : $(OBJ)
    $(CC) -o $@ prog/$^ $(CFLAGS)

clean : rm -rf *.o
mrproper : clean rm -rf $(EXEC) 
PS:a.c:打印a,b.c:打印b和主。c使用a.c和b.c

我看到两个问题:

  • 您的
    %.o
    规则实际上不会创建
    %.o
    文件
  • prog/$^
    扩展为
    prog/a.o b.o main.o
    ,因为
    $(OBJ)
    a.o b.o main.o
  • 我会这样做:

    而不是
    OBJ=$(SRC:.c=.o)
    ,写

    OBJ=$(SRC:%.c=prog/%.o)
    
    然后,对象文件的规则变为

    prog/%.o:%.c
    $(CC)-o$@-c$<$(CFLAGS)
    
    可执行文件可以用

    $(EXEC):$(OBJ)
    $(CC)-o$@$^$(CFLAGS)
    
    最后,出于理智的原因,您的清理规则可能应该

    clean:
    rm-射频程序/*.o
    正确:清洁
    rm-rf$(执行)
    
    这里回答:您是否考虑过使用CMake生成Makefile,而不是以艰难的方式构建它?非常感谢您
    gcc -o prog/a.o -c a.c -Wall -pedantic -std=c11 -g
    gcc -o prog/b.o -c b.c -Wall -pedantic -std=c11 -g
    gcc -o prog/main.o -c main.c -Wall -pedantic -std=c11 -g
    gcc -o exe prog/a.o b.o main.o -Wall -pedantic -std=c11 -g
    gcc: error: b.o: No file or directory
    gcc: error: main.o: No file or directory
    Makefile:13: recipe for target 'exe' failed
    make: * [exe] Error 1