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

标签 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

这是我正在使用的生成文件。正如它生成的代码一样,它会在任何文件更改(.h 或 .c)时正确更新,问题是生成的依赖项没有设置正确的对象路径(我已经阅读了它在 gcc 中的错误当它写入文件依赖项时)所以我想我会制作一个脚本,只需将路径添加到它并且它会起作用并且我能够将我的目标文件放在它们所属的位置(对象文件夹)但是每次我尝试在初始编译后运行 make(顺便说一句,效果很好)它给了我一个错误,说其中一个头文件不存在(这是不正确的,因为文件在那里并且我可以访问它)。

有人知道发生了什么事吗?(要在“模式”之间切换,我只需在每个 %.o 和 *.o 之前写 $(OBJDIR))

最佳答案

这条规则看起来很可疑:

$(HEADDIR)%.h: %.o 
   @echo $@ $*
   @$(eval LIB = $(patsubst $(HEADDIR)%.h,$(LIBDIR)lib%.a,$@))
   $(LIBC) $(LIBFLAG) $(LIB) $(patsubst $(LIBDIR)lib%.a,%.o,$(LIB))

它声称要从 .o 文件创建 .h 文件,但根据规则,这似乎不太可能。

关于c - Makefile:文件不存在时文件不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26888355/

相关文章:

makefile - 一个项目可以同时支持Autotools和Cmake吗?

c++ - 什么是 -D 编译器标志 C++(clang、GNU、MSVC)

c - Openwrt包的Makefile中错误定义宏

c++ - Linux编程中的多目录 "make"

c - Microsoft 编译器下 _rdrand_step 内在函数的可用性?

c++ - 为什么我们可以在 C 中写越界?

c - 为什么我的编译器不接受 fork(),尽管我包含了 <unistd.h>?

c - 函数 fscanf 忽略 .txt 文件中的空格分隔符

c - PostgreSQL ecpg 程序不保存对数据库的更改

makefile - "make clean"和 "make clobber"有什么区别?