Как скомпилировать файлы в подкаталоге с помощью make-файла - PullRequest
1 голос
/ 19 октября 2019

Вот как выглядит мой каталог:

src/
    dir/
        file2.c
        file2.h
    file1.c
    file1.h
    makefile

Когда я использую свой make-файл, я получаю: gcc: error: file2.o: No such file or directory

Использование из каталога src: gcc -c dir/file2.c dir/file2.h Я получаю правильное значение. о который создан в src (это то, что я хочу). Но используя make-файл, я получаю сообщение об ошибке выше.

Простейшая версия моего make-файла:

CFLAGS = -ansi -Wall -pedantic -g -I$(LIBRE_INC) -Iinclude -std=gnu99
LDFLAGS = -lm
EXEC = out
CC = gcc

out :  file1.o file2.o
    ${CC} -o $@ $^ $(CFLAGS) $(LDFLAGS)

file1.o: file1.c file1.h

file2.o: dir/file2.c dir/file2.h

%.o : %.c
    ${CC} -c $< $(CFLAGS) $(LDFLAGS)

Make дает:

gcc -c file1.c -ansi -Wall -pedantic -g -I -Iinclude -std=gnu99 -lm
gcc -o out file1.o file2.o -ansi -Wall -pedantic -g -I -Iinclude -std=gnu99 -lm
gcc: error: file2.o: No such file or directory
makefile:7: recipe for target 'out' failed
make: *** [out] Error 1

Я знаю, чтопроблема исходит от

%.o : %.c
    ${CC} -c $< $(CFLAGS) $(LDFLAGS)

Но я не знаю, как ее заменить

Редактировать: я добавил эту строку в каждый файл, где у меня был подкаталог, и он работал

${CC} -c $< $(CFLAGS) $(LDFLAGS)

Я все еще ищу лучший путь, если есть!

Ответы [ 2 ]

2 голосов
/ 19 октября 2019

Хранение всех объектных файлов в одном каталоге, даже если исходные файлы находятся в разных каталогах, вызывает проблемы. Что происходит, когда у вас есть init.c и dir/init.c? Объектные файлы init.o перезаписывают друг друга.

Я бы заменил каждый file2.o на dir/file2.o, и он должен работать.

Кроме того, ваше правило шаблона

%.o : %.c
    ${CC} -c $< $(CFLAGS) $(LDFLAGS)

не использует $@ для ссылки на цель, которую он должен, в соответствии с надлежащим makefile инженерным:

%.o : %.c
    ${CC} -c $(CFLAGS) $(LDFLAGS) -o $@ $<
2 голосов
/ 19 октября 2019

%.o: %.c говорит make, что он может собрать file2.o, если существует file2.c, и он может построить dir/file2.o, если существует dir/file2.c. Но вы хотите построить file2.o из dir/file2.c. Ваш make-файл не содержит каких-либо инструкций о том, как это сделать.

Одно из решений, которое обычно удобно, если у вас никогда не бывает файлов с одинаковыми именами в разных каталогах, - это заставить make искать исходные файлы в разных каталогах. ,С помощью переменной VPATH или директивы vpath вы можете указать make найти исходный файл в dir, если он не может найти его в верхнем каталоге,Добавьте

VPATH = dir

или

vpath %.c dir

или

vpath file2.c dir

в ваш make-файл.

...