Makefile: Как поместить все файлы .o в каталог - PullRequest
0 голосов
/ 10 декабря 2018

Я хочу поместить весь файл .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) 

И есть результат в оболочке (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: ac: печать A, bc: печать B et main.c использовать ac и bc

1 Ответ

0 голосов
/ 10 декабря 2018

Я вижу две проблемы:

  1. Ваше правило %.o фактически не создает %.o файлов.
  2. 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) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...