Во-первых, эта ссылка не указывает на make-файл, она указывает на вывод вашей попытки запустить make. Во-вторых, я не вижу доказательств того, что это на самом деле произвело mfg-sample-app.o
, но вы говорите, что это так, поэтому я поверю на ваше слово.
Есть несколько разных причин, которые могут вызывать эту ошибку. Я предлагаю вам восстановить строку 70, начать с чистого листа и запустить make дважды . Я думаю, что есть большая вероятность, что он создаст объектные файлы на первом проходе и найдет их на втором. И независимо от того, что он делает, мы чему-то научимся. (Я бы посоветовал вам также перейти на более авторитетный компилятор / компоновщик, такой как gcc, но похоже, что он использует некоторые флаги нестандартным способом.)
Вторую ошибку, которую вы получили, легко понять: вы удалили строку, которая определяла список объектов, и в этом списке было определено правило, поэтому Make больше не знал, как создавать эти объекты. Но меня пугает, что Make знал, как вызвать компоновщик без этого списка; это говорит о том, что в вашем make-файле много избыточности, и это плохо.
Кстати, какую марку вы используете? Попробуйте запустить make -v
и посмотрите, что там написано.
EDIT:
Теперь, когда я могу посмотреть на make-файл, я думаю, что смогу разгадать эту тайну.
Исходный файл, о котором идет речь, E:/em35x/app/mfglib/mfg-sample.c
. Со строкой 70 Make просто меняет .c
на .o
и приходит к выводу, что рассматриваемый объектный файл - E:/em35x/app/mfglib/mfg-sample.o
. Но вы жестко закодировали путь к каталогу компоновки во флаги компилятора ( очень плохая практика), так что туда идут файлы объектов. Затем, когда Make достигает шага связывания, он не может найти E:/em35x/app/mfglib/mfg-sample.o
и умирает.
Когда вы запускаете без строки 70, он использует предыдущую строку и приходит к выводу, что mfg-sample.o
должен находиться в каталоге сборки. Если этот объектный файл уже существует до запуска, Make связывает объектные файлы вместе, и все в порядке. Но если этого файла нет, то Make не может его собрать, потому что этот make-файл знает только один способ создания объектного файла - компиляция исходного кода , который находится в том же каталоге, где он намеревается создать объект *. 1031 *. Поскольку в каталоге сборки такого исходного файла нет, он умирает.
Этот make-файл может использовать много работы, но вот самое маленькое изменение, которое (вероятно) решит вашу проблему. (Вы не сказали, какую версию Make вы используете - это работает для GNUMake.) Избавьтесь от строки 70 и измените вторую до последней строки:
$(END_DIR)/%.o : %.c
Теперь, независимо от того, куда Make думает, что объектный файл должен идти, он будет искать исходный файл без пути (mfg-sample.c
), и VPATH найдет его.
P.S. Жиль отметил, что разделитель в VPATH может не работать в Windows. Если предложенное мной изменение не работает, попробуйте также изменить разделитель, как предлагает Жиль (изменение только одного разделителя не поможет).
EDIT:
VPATH, похоже, не работает. Мы можем обойтись без этого, но я хотел бы попробовать последний эксперимент, прежде чем мы откажемся от него. Пожалуйста, попробуйте это и расскажите нам, что происходит:
END_DIR = E:/em35x/build/mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680
OBJ = $(END_DIR)/mfg-sample.o
VPATH = E:/em35x/app/mfglib
mfg-sample-app.out : $(OBJ)
@echo found $<, making $@
$(END_DIR)/%.o : %.c
@echo found $<, making $@
@touch $@
РЕДАКТИРОВАТЬ 3:
Хорошо, VPATH не работает - может быть, позже мы сможем выяснить, почему.
Попробуйте это (это может сработать, а может и нет - мне сложно проверить пути в стиле Windows):
END_DIR = E:/em35x/build/mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680
OBJ = $(END_DIR)/mfg-sample.o
mfg-sample-app.out : $(OBJ)
@echo found $<, making $@
$(END_DIR)/mfg-sample.o : E:/em35x/app/mfglib/mfg-sample.c
$(END_DIR)/%.o :
@echo found $<, making $@
@touch $@
РЕДАКТИРОВАТЬ 4:
Скрестите пальцы и попробуйте вставить это в свой настоящий make-файл (и избавиться от строки 70):
$(END_DIR)/mfg-sample.o: E:/em35x/app/mfglib/mfg-sample.c
$(END_DIR)/ember-configuration.o: E:/em35x/hal/ember-configuration.c
CORTEXM3 = adc \
bootloader-interface-app \
bootloader-interface-standalone \
bootloader-interface \
button \
buzzer \
cstartup-iar-common \
diagnostic \
led \
mfg-token \
micro-common \
micro \
sleep \
token-def \
token \
uart
CORTEXM3_OBJS = $(patsubst %,$(END_DIR)/%.o,$(CORTEXM3))
$(CORTEXM3_OBJS): $(END_DIR)/%.o : E:/em35x/hal/micro/cortexm3/%.c
GENERIC = crc \
endian \
mem-util \
random \
sim-eeprom
GENERIC_OBJS = $(patsubst %,$(END_DIR)/%.o,$(GENERIC))
$(GENERIC_OBJS): $(END_DIR)/%.o : E:/em35x/hal/micro/generic/%.c
$(END_DIR)/cli.o $(END_DIR)/serial.o: $(END_DIR)/%.o : E:/em35x/app/util/serial/%.c
$(END_DIR)/mpu.o: E:/em35x/hal/micro/cortexm3/em35x/mpu.c
$(END_DIR)/%.o :
$(CC) $(CFLAGS) $(INCLUDES) $<
Видите, почему VPATH так удобен?
РЕДАКТИРОВАТЬ 5:
Файлы s79:
Мы меняем правило (последние две строки EDIT 4):
# change this:
#
# $(END_DIR)/%.o :
# $(CC) $(CFLAGS) $(INCLUDES) $<
# to this:
$(END_DIR)/mfg-sample.o \
$(END_DIR)/ember-configuration.o \
$(CORTEXM3_OBJS) \
$(GENERIC_OBJS) \
$(END_DIR)/cli.o $(END_DIR)/serial.o \
$(END_DIR)/mpu.o:
$(CC) $(CFLAGS) $(INCLUDES) $<
(Вы можете поместить эти цели в одну строку, если хотите, я собирался для удобочитаемости.)
Убедитесь, что это работает, затем добавьте другое правило для источников s79:
$(END_DIR)/faults.o $(END_DIR)/isr-stubs.o : $(END_DIR)/%.o : E:/em35x/hal/micro/cortexm3/%.s79
@echo attempting to build $@ from $<
$(ASM) $(AFLAG) $(AFLAG1) $(AFLAG2) $(AFLAG3) $(AFLAG4) $<
И обязательно добавьте эти два к переменной OBJ
, чтобы Make знал, что нужно mfg-sample-app.out
.
VPATH. Я не знаю, почему VPATH не работает.Возможно дополнительное расследование, но это очень трудно сделать удаленно, как это.Вы можете попробовать длинный вариант: в экспериментальном make-файле, который я предложил (во втором блоке EDIT), измените строку VPATH на:
vpath %.c E:/em35x/app/mfglib
(обратите внимание на нижний регистр.)
Файлы зависимостей (.d). Я не знаю, работают ли команды в правилах (у меня нет доступа к вашим инструментам "Embedded Workbench"), но причина, по которой правила не отображаются 'Вызывается, что операторы
include
используют переменную (
sources
), которая не определена.Make не может найти исходные файлы таким образом, поэтому он не думает, что он должен включать что-либо, поэтому он не думает, что должен что-то создавать (и не мог, даже если бы захотел, потому что не мог найтиисточники).Вместо этого вы можете использовать переменную
SRC
, но не забудьте добавить в файлы s79.
Преобразование файлов .out. Кусок торта:
E:\em35x\build\mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680\mfg-sample-app.s37 : mfg-sample-app.out
ielftool.exe --srec --verbose $< $@
(Если вы хотите, чтобы это была ваша цель по умолчанию, поставьте ее перед всеми остальными.) Я жестко прописал путь к цели s37, потому что вы ее указали.Вы могли бы, вероятно, сделать только с mfg-sample-app.s37
.