首页 文章

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

提问于
浏览
0

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

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)

shell(Ubuntu)中有结果:

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

PS:a.c:print A,b.c:print B et main.c使用a.c和b.c.

1 回答

  • 1

    我看到两个问题:

    • 您的 %.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 -rf prog/*.o
    mrproper : clean
            rm -rf $(EXEC)
    

相关问题