Вот мой make-файл http://pastie.org/1104332. Я пытаюсь скомпилировать разные файлы .c и файлы .s (файлы сборки) из разных подкаталогов в E:/em35x/build/mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680/, тогда компоновщик должен связать все файлы .o из каталога сборки (E:/em35x/build/mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680) в файл с именем mfg-sample-app.out. Когда я запускаю make-файл, который я разместил выше, компилятор компилирует все исходные файлы в объектные файлы в каталоге сборки, но компоновщик не может открыть объектные файлы, потому что он не ищет их в каталоге сборки, который находится в E:/em35x/ build/mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680. Я не знаю, почему линкер не смотрит туда? это ошибка, которую я получаю:
E:\IARSystems\EmbeddedWorkbench5.4Evaluation\arm\bin\ilinkarm.exe" -o E:/e
m35x/build/mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680/mfg-sample-app.out --
map E:/em35x/build/mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680/mfg-sample-ap
p.map --log initialization,modules,sections,veneers --log_file E:/em35x/build/mf
g-sample-app-cortexm3-iar-em357-em3xx-dev0680/mfg-sample-app.log --config E:/em3
5x/app/mfglib/ewb-em357/../../../hal/micro/cortexm3/em35x/em357/iar-cfg.icf --di
ag_suppress Lp012 --entry halEntryPoint E:/em35x/build/alarm-library-cortexm3-i
ar-em357-em3xx/alarm-library.a E:/em35x/build/binding-table-stub-library-cortexm
3-iar-em357-em3xx/binding-table-stub-library.a E:/em35x/build/cbke-stub-library
-cortexm3-iar-em357-em3xx/cbke-stub-library.a E:/em35x/build/end-device-bind-stu
b-library-cortexm3-iar-em357-em3xx/end-device-bind-stub-library.a E:/em35x/buil
d/hal-library-cortexm3-iar-em357-em3xx/hal-library.a E:/em35x/build/mfglib-libra
ry-cortexm3-iar-em357-em3xx/mfglib-library.a E:/em35x/build/security-library-co
re-cortexm3-iar-em357-em3xx/security-library-core.a E:/em35x/build/security-libr
ary-link-keys-stub-cortexm3-iar-em357-em3xx/security-library-link-keys-stub.a E:
/em35x/build/zigbee-pro-stack-cortexm3-iar-em357-em3xx/zigbee-pro-stack.a E:/em3
5x/app/mfglib/mfg-sample.o E:/em35x/hal/ember-configuration.o E:/em35x/hal/micro
/cortexm3/adc.o E:/em35x/hal/micro/cortexm3/bootloader-interface-app.o E:/em35x/
hal/micro/cortexm3/bootloader-interface-standalone.o E:/em35x/hal/micro/cortexm3
/bootloader-interface.o E:/em35x/hal/micro/cortexm3/button.o E:/em35x/hal/micro/
cortexm3/buzzer.o E:/em35x/hal/micro/cortexm3/cstartup-iar-common.o E:/em35x/hal
/micro/cortexm3/diagnostic.o E:/em35x/hal/micro/cortexm3/led.o E:/em35x/hal/micr
o/cortexm3/mfg-token.o E:/em35x/hal/micro/cortexm3/micro-common.o E:/em35x/hal/m
icro/cortexm3/micro.o E:/em35x/hal/micro/cortexm3/sleep.o E:/em35x/hal/micro/cor
texm3/token-def.o E:/em35x/hal/micro/cortexm3/token.o E:/em35x/hal/micro/cortexm
3/uart.o E:/em35x/hal/micro/generic/crc.o E:/em35x/hal/micro/generic/endian.o E:
/em35x/hal/micro/generic/mem-util.o E:/em35x/hal/micro/generic/random.o E:/em35x
/hal/micro/generic/sim-eeprom.o E:/em35x/app/util/serial/cli.o E:/em35x/app/util
/serial/serial.o E:/em35x/hal/micro/cortexm3/em35x/mpu.o E:/em35x/hal/micro/cort
exm3/faults.o E:/em35x/hal/micro/cortexm3/isr-stubs.o
IAR ELF Linker V5.50.5.51995/W32 for ARM
Copyright (C) 2007-2010 IAR Systems AB.
Fatal error[Li001]: could not open file "E:\em35x\app\mfglib\mfg-sample.o"
Fatal error detected, aborting.
make: *** [mfg-sample-app.out] Error 3
(сначала он компилирует исходные файлы, но в конце не может найти объектные файлы в папке сборки)
Теперь, после того, как я удалю строку 70 из файла makefile, который
OBJ = $(SRC:.c=.o) E:/em35x/hal/micro/cortexm3/faults.o E:/em35x/hal/micro/cortexm3/isr-stubs.o
тогда компоновщик может найти предыдущие скомпилированные объектные файлы в каталоге сборки и создать файл .out. И если я вручную удалю все объектные файлы из каталога сборки (который компилятор создал ранее) и снова запущу makefile (строка 70 все еще удалена), то я получаю эту ошибку:
$ make
make: *** No rule to make target `E:/em35x/build/mfg-sample-app-cortexm3-iar-em3
57-em3xx-dev0680/mfg-sample.o', needed by `mfg-sample-app.out'. Stop.
И если я снова добавлю строку 70, которая:
OBJ = $(SRC:.c=.o) E:/em35x/hal/micro/cortexm3/faults.o E:/em35x/hal/micro/cortexm3/isr-stubs.o
затем он снова компилируется, но не связывается, потому что не может открыть объектные файлы. (Снова первая упомянутая ошибка)
Я не знаю, что я делаю неправильно. Я пробовал много вещей, но не могу найти свою проблему.
Спасибо
EDIT: я использую GNU Make 3.81
изменили предпоследнюю строку на:
$(END_DIR)/%.o : %.c
и я также внес изменения в VPATH, как было предложено Жилем, но безуспешно.
Теперь я получаю эту ошибку:
$ make
make: *** No rule to make target `E:/em35x/build/mfg-sample-app-cortexm3-iar-em3
57-em3xx-dev0680/mfg-sample.o', needed by `mfg-sample-app.out'. Stop.
Он не компилирует какой-либо файл .c в файл .o.
EDIT: Бета, я смогу протестировать ваши линии в понедельник. Затем я сообщу о результатах, я хочу решить эту проблему, она сводит меня с ума. Спасибо
ИЗМЕНИТЬ:
Привет Бета,
Я все еще получаю ту же ошибку с кодом, который вы предложили. Это ошибка, если mfg-sample.o отсутствует в папке сборки (E:/em35x/build/mfg-sample-app-cortexm3-iar-em3 57-em3xx-dev0680):
tjoyia@TJ-PC /e/em35x/build/mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680
$ make
make: *** No rule to make target `E:/em35x/build/mfg-sample-app-cortexm3-iar-em3
57-em3xx-dev0680/mfg-sample.o', needed by `mfg-sample-app.out'. Stop.
Но если mfg-sample.o уже существует в папке сборки (после того, как я скомпилировал mfg-sample.c с mfg-sample.o), я получаю это сообщение:
tjoyia@TJ-PC /e/em35x/build/mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680
$ make
found E:/em35x/build/mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680/mfg-sample.
o, making mfg-sample-app.out
ИЗМЕНИТЬ:
Привет, бета. Да, это сработало.
Я получил это сообщение:
tjoyia@TJ-PC /e/em35x/build/mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680
$ make
found E:/em35x/app/mfglib/mfg-sample.c, making E:/em35x/build/mfg-sample-app-cor
texm3-iar-em357-em3xx-dev0680/mfg-sample.o
found E:/em35x/build/mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680/mfg-sample.
o, making mfg-sample-app.out
Итак, что мне теперь делать в моем исходном make-файле? Я хочу скомпилировать весь свой проект и связать объектные файлы (все мои файлы .c в разных местах пути в папку сборки, а затем компоновщик должен связать ранее созданные файлы .o в файл .out)
ИЗМЕНИТЬ:
Привет Бета,
Хорошо, у меня это работает, но как насчет двух файлов .s79, как я могу их также скомпилировать в объектные файлы в каталоге сборки? Почему VPATH не работает, и я думаю, что мое создание файла зависимостей (.d) не вызывается, как я могу вызвать его. Я хочу, чтобы все файлы .h (инструкции #include в исходных файлах) автоматически распознавались и зависели от объектного файла.
И после этого я хочу преобразовать файлы .out, но они не вызываются.
Вот проблема:
Знаете ли вы, как я могу добавить это в свой make-файл:
ielftool.exe --srec --verbose E:\em35x\build\mfg-sample-app-cortexm3-iar-em357-em3xx-dev0680\mfg-sample-app.out E:\em35x\build\mfg-sample- приложение-cortexm3-iar-em357-em3xx-dev0680\mfg-sample-app.s37
Он должен преобразовать файл mfg-sample-app.out в mfg-sample-app.s37 после того, как файл .out будет создан/слинкован из объектных файлов.