我想将所有.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:打印A,b.c:打印B等main.c使用a.c和b.c
答案 0 :(得分: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)