# Arquitectura
CC := arm-none-eabi-
# Compiladores
GCC :=$(CC)gcc
AS :=$(CC)as
LIBC :=$(CC)ar
# Linker
LINKER :=$(CC)ld
# Flags compilação
FLAGDEBUG :=-g
CFLAGS :=-c -mapcs #-Wall
CDEPEND :=-MM -MF
LIBFLAG := rcs
LDSCRIPT := -T
LDLIBDIR := -L
LDLIBLIBS := -l
# $@ -> nome do alvo .. $^/S? lista de dependencias .. $* contêm o valor de % .. $< contêm a primeira dependencia
# Pastas
DEPDIR := Depends/
SOURCEDIR := Source/
SOURCECDIR :=$(SOURCEDIR)C/
SOURCEADIR :=$(SOURCEDIR)Assembly/
LIBDIR := Library/
HEADDIR := Header/
OBJDIR := Object/
# Dependencias
SOURCEC := $(wildcard $(SOURCECDIR)*.c)
SOURCEA := $(wildcard $(SOURCEADIR)*.S)
OBJC :=$(patsubst $(SOURCECDIR)%.c,%.o,$(SOURCEC))
OBJA :=$(patsubst $(SOURCEADIR)%.S,%.o,$(SOURCEA))
HEADER :=$(wildcard $(HEADDIR)*.h)
LIBL = $(wildcard $(LIBDIR)*.a)
#LIBL = $(wildcard $(LIBDIR)lib*.a)
DEPEND :=$(patsubst %.o,$(DEPDIR)%.d,$(OBJC))
SCRIPT := $(wildcard *.ld)
LIB =
# Ficheiros de output
FICHDEBUG := Teste.axf
FICHRELEASE := Release.axf
debug: $(FICHDEBUG)
# Executável para debug
$(FICHDEBUG):$(OBJA) $(OBJC)
@echo A efectuar a linkagem dos módulos para gerar o executável $@
@$(LINKER) $(OBJA) $(OBJC) $(LDSCRIPT) $(SCRIPT) -o $@
# Compilar ficheiros .S e .c
%.o:$(SOURCEADIR)%.S
@echo A compilar $@ a partir de $*.S
@$(AS) $(FLAGDEBUG) $< -o $@
%.o:$(SOURCECDIR)%.c
@echo A compilar $@ a partir de $*.c
$(GCC) $(CDEPEND) $(patsubst %.o,$(DEPDIR)%.d,$@) $<
$(GCC) $(FLAGDEBUG) $(CFLAGS) $< -o $@
-include $(DEPEND)
release: $(FICHRELEASE)
$(FICHRELEASE): $(OBJA) $(OBJC)
@echo A efectuar a linkagem dos módulos para gerar o executável $@
@$(LINKER) $(OBJA) main.o $(LDSCRIPT) $(SCRIPT) -o $@ $(LDLIBDIR) $(LIBDIR) $(LDLIBLIBS)
# Gerar bibliotecas necessárias
gerarLib:$(HEADER)
@echo $(HEADER)
$(HEADDIR)%.h: %.o
@echo $@ $*
@$(eval LIB = $(patsubst $(HEADDIR)%.h,$(LIBDIR)lib%.a,$@))
$(LIBC) $(LIBFLAG) $(LIB) $(patsubst $(LIBDIR)lib%.a,%.o,$(LIB))
.PHONY: clean
clean:
@ rm -rf $(DEPDIR)*.d $(SOURCEDIR)*/*~ *~ *.o $(LIBDIR)*.a *.axf *.o
所以继承我正在使用的makefile。因为它是生成代码作为其假定的ant它在任何文件更改(.h或.c)时正确更新,问题是生成的依赖项没有正确的对象路径集(我已经在gcc中读到了它的错误)当它写入文件依赖项时)所以我想我会创建一个脚本,只是添加路径到它,它会工作,我能够把我的目标文件放在它们所属的位置(对象文件夹)但是每次我尝试在初始编译后运行make(工作正常btw)它给了我一个错误说一个头文件不存在(这是不真实的,因为文件在那里,我可以访问它)。
任何人都知道发生了什么事?(要在“模式”之间切换,我只需在每个%.o和* .o之前编写$(OBJDIR)
答案 0 :(得分:0)
这条规则看起来很可疑:
$(HEADDIR)%.h: %.o
@echo $@ $*
@$(eval LIB = $(patsubst $(HEADDIR)%.h,$(LIBDIR)lib%.a,$@))
$(LIBC) $(LIBFLAG) $(LIB) $(patsubst $(LIBDIR)lib%.a,%.o,$(LIB))
它声称正在从.h
文件创建.o
个文件,但根据规则,这似乎不太可能。