Почему этот make-файл не работает, когда я удаляю директиву vpath? - PullRequest
0 голосов
/ 27 февраля 2020

Я поиграюсь с make-файлами GNU G CC, и сделал этот простой, чтобы создать "Hello, world!" Программа.

CC=gcc
SOURCES=./Source/main.c
BUILD_DIR=./Build
TARGET=main

all: $(BUILD_DIR)/$(TARGET).exe

OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(SOURCES)))

$(BUILD_DIR)/%.o: %.c
    $(CC) -c $< -o $@

$(BUILD_DIR)/%.exe: $(OBJECTS)
    $(CC) $< -o $@

Я не могу понять, почему, когда я удаляю или комментирую эту строку vpath %.c $(sort $(dir $(SOURCES))), останавливается и возвращает эту ошибку:


> Executing task: D:\Servers\Compilers\MinGW\bin\mingw32-make.exe GCC_PATH=D:\Servers\Compilers\gcc-arm-none-eabi\bin <

mingw32-make: *** No rule to make target 'Build/main.exe', needed by 'all'.  Stop.

Не могли бы вы объяснить, почему?

1 Ответ

0 голосов
/ 27 февраля 2020

Вы добавили префикс к объектному файлу, чтобы ваши ОБЪЕКТЫ были './Build/main.o'.
Но когда вы используете правило stati c, постфикс' .o 'будет заменен на' . c ', поэтому ваши ОБЪЕКТЫ: ./Build/main.c.Your main. c не находится в каталоге "Build", поэтому, безусловно, произошел сбой. Когда вы добавляете vpath %.c $(sort $(dir $(SOURCES))), он будет автоматически найти файл .c из каталога Build.

...