У меня есть проект baremetal, который включает файлы .s в файлы .c. Интересно, как я могу написать make-файл, где я sepparate компилировать файлы .s из файлов .c. Файлы находятся во вложенных папках (источник, включение, запуск) программы. Я собирался сделать что-то подобное. Это хорошо? Как я могу связать объекты с exe?makefile с .s файлами рядом с .c файлами
SHELL := /bin/bash
ROOT := $(shell pwd)
VPATH := $(ROOT)/source:/$(ROOT)/startup:$(ROOT)/include
EXE := exe
OBJECTS_GCC := $(patsubst %.c,%.o,$(wildcard *.c))
OBJECTS_AS := $(patsubst %.s,%.o,$(wildcard *.s))
AS := arm-none-eabi-as -mcpu=arm926ej-s -Wall
GCC := arm-none-eabi-gcc -mcpu=arm926ej-s -Wall
LD := arm-none-eabi-ld -T test.ld -o $(EXE)
all: $(EXE)
$(EXE): startups sources
startups: $(OBJECTS_AS)
$(AS) $(OBJECTS_AS)
sources: $(OBJECTS_GCC)
$(GCC) $(OBJECTS_GCC)
У меня возникли трудности с поиском любого примера, включающего файлы .s вместе с .c файлами.
С уважением.
Вот последняя версия Makefile, где найдены header.h разве:
SHELL := /bin/bash
ROOT := $(shell pwd)
INC := $(ROOT)/inc
SRC := $(ROOT)/src
STR := $(ROOT)/str
EXE := exe
AS := arm-none-eabi-as -mcpu=arm926ej-s -c -Wall -I $(INC) -I$(SRC) -I $(STR)
GCC := arm-none-eabi-gcc -mcpu=arm926ej-s -c -Wall -I $(INC) -I$(SRC) -I $(STR)
LDSCRIPT := test.ld
LD := arm-none-eabi-ld -T $(LDSCRIPT)
HEADERS := $(notdir $(wildcard $(INC)/*.h))
SOURCES_GCC := $(notdir $(wildcard $(SRC)/*.c))
SOURCES_AS := $(notdir $(wildcard $(STR)/*.s))
OBJECTS_GCC := $(SOURCES_GCC:.c=.o)
OBJECTS_AS := $(SOURCES_AS:.s=.o)
VPATH := $(STR):$(SRC):$(INC)
all : $(EXE)
@echo konec postopka: izvrsljiv program po imenu $(EXE) se nahaja v mapi $(ROOT)
$(EXE) : $(OBJECTS_AS) $(OBJECTS_GCC)
@echo objekti so: $(OBJECTS_AS) $(OBJECTS_GCC)
@echo headerji so: $(HEADERS)
@echo linkanje objektov v izvrsljiv program...
$(LD) -o [email protected] $^
%.o : %.s %.h
@echo prevajanje ASSEMBLY izvornih datotek...
$(AS) -o [email protected] $<
%.o : %.c %.h
@echo prevajanje C izvornih datotek...
$(GCC) -o [email protected] $<
.PHONY : clean
clean :
@echo brisanje objektov
rm *.o
@echo brisanje izvrsljivega programa
rm $(EXE)
В ответ на обновленный Makefile, я понятия не имею, почему header.h не найден, если он действительно существует в каталоге ИНК. Однако я отмечаю, что вы указали в одном из своих комментариев, что header.h - ваш единственный заголовок, но неявное правило, которое вы определили, ищет отдельный заголовок для каждого объектного файла. Если только один заголовочный файл, и каждый объектный файл зависит от него, вы должны явно указать его, а не использовать шаблон% .h. Измените правило шаблона на '% .o:% .s header.h' или удалите% .h из правила шаблона и поместите в следующую строку:' $ (OBJECTS_AS) $ (OBJECTS_GCC): header.h'. – eriktous
Возможно, вам стоит начать новый вопрос для этой новой проблемы с отсутствующим заголовком. Включите ваш последний файл makefile и точное сообщение об ошибке, которое вы получите при запуске. – eriktous
Я начал новую тему, и нам удалось решить некоторые проблемы. Теперь make-файл работает. Этот make-файл предназначен для другого проекта с той же древовидной структурой и большим количеством заголовков в папке inc, изменение soo% .h в header.h не является вариантом. Пожалуйста, загляните сюда: http: // stackoverflow.com/questions/5626606/make-uses-cc-вместо-arm-none-eabi-as – 71GA