Makefile:文件存在时文件不存在

时间:2014-11-12 13:39:39

标签: c makefile

# 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)

1 个答案:

答案 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个文件,但根据规则,这似乎不太可能。