Makefile не может найти файл при использовании vpath - PullRequest
4 голосов
/ 05 февраля 2012

Когда я использую make, он говорит:

gcc -I./header -c -g main.c
gcc: error: main.c: No such file or directory

Мой make-файл находится здесь:

vpath %.c ./src
vpath %.h ./header

CC = gcc
FLAG = -I./header -c -g
objects = main.o a.o b.o

app: ${objects}
    ${CC} -o app ${objects}

main.o: main.c command.h
    ${CC} ${FLAG} main.c

a.o: a.c command.h
    ${CC} ${FLAG} a.c

b.o: b.c command.h
    ${CC} ${FLAG} b.c

clean: 
    -rm *.o app

.PHONY: clean

и файлы хранятся так:

.
|-- header
|   `-- command.h
|-- Makefile
`-- src
    |-- a.c
    |-- b.c
    `-- main.c

Чтоне так с Makefile?

1 Ответ

4 голосов
/ 05 февраля 2012

Вы должны использовать автоматические переменные вместо жестко закодированных значений для имен файлов в рецептах:

main.o: main.c command.h
    ${CC} ${FLAG} $<

...

Это позволяет Make вставлять правильные имена файлов, найденные в vpath:

Если при поиске в каталоге найдено обязательное условие в другом каталоге, это не может изменить рецепт правила; они будут исполнены как написано. Поэтому вы должны тщательно написать рецепт, чтобы он нашел предварительное условие в каталоге, где его находит make.

Это делается с помощью автоматических переменных, таких как $^ (см. Автоматические переменные ). Например, значение $^ представляет собой список всех предпосылок правила, включая имена каталогов, в которых они были найдены, а значение $@ является целью.

...