Makefile镜像生成目录
我需要创建一个Makefile来编译带有很多子目录的.c文件(sources目录的深度大约为5级),并且我需要将对象文件放在镜像构建目录中。到目前为止,我已经创建了这个Makefile:Makefile镜像生成目录,makefile,mirror,Makefile,Mirror,我需要创建一个Makefile来编译带有很多子目录的.c文件(sources目录的深度大约为5级),并且我需要将对象文件放在镜像构建目录中。到目前为止,我已经创建了这个Makefile: CC := gcc.exe AS := as.exe CFLAGS = -DCORE_SW_VERSION='"$(CORE_SW_VERSION)"' -Wall -mA6 -c -fmessage-length=0 -Hsdata0 CFLAGS += -fgnu89-inline -mno-volati
CC := gcc.exe
AS := as.exe
CFLAGS = -DCORE_SW_VERSION='"$(CORE_SW_VERSION)"' -Wall -mA6 -c -fmessage-length=0 -Hsdata0
CFLAGS += -fgnu89-inline -mno-volatile-cache $(INCLUDE) -Hon=each_function_in_own_section -Xcrc -std=c99 -O1
CORE_SW_VERSION:=CORE.07.01.04.01.03.01.R
HAL_SW_VERSION:=16.01.06.01.06.00
MODE_CORE := dev
MODE_HAL := dev
OBJDIR := $(shell pwd)/$(TARGET12) #TARGET12 is a make parameter
INCLUDE := $(shell cat ./$(TARGET12)_include.txt)
SOURCEDIR := ../sources
CSRC := $(shell find $(SOURCEDIR) -name '*.c')
EXCLUDES := $(shell cat ./$(TARGET12)_exclude.txt)
OBJ := $(CSRC:.c=.o)
OBJS := $(patsubst ../%.c,$(OBJDIR)/%.o,$(CSRC))
.PHONY: $(TARGET12)
$(TARGET12): $(OBJS)
$(AR) -r $(CORE_SW_VERSION).a $(OBJS)
$(OBJS): $(CSRC)
mkdir -p $(dir $@)
$(CC) $(CFLAGS) $< -o $(patsubst ../%,$(OBJDIR)/%,$@)
我得到一个错误,即没有为.c文件设置目标的规则。但我看到make正在构建镜像目录中查找.c文件,它应该查看源目录。你知道怎么安排吗
提前谢谢你 您尝试的$(OBJS)
的第一条规则规定,每个对象文件分别依赖于所有源文件。这肯定是不对的。你的第二次尝试更好,尽管食谱很奇怪。修复该问题,并使用
VPATH
使make
查找源。您尝试的$(OBJS)
的第一条规则声明每个对象文件分别依赖于所有源文件。这肯定是不对的。你的第二次尝试更好,尽管食谱很奇怪。修复该问题,并使用
VPATH
使make
找到源代码。规则$(OBJS):%.o:%.c
的意思是:当尝试创建.o
文件时,如果相应的.c
文件存在,请使用此规则。例如:当make正在寻找创建$(OBJDIR)/foo.o
的方法时,它将寻找$(OBJDIR)/foo.c
在您的情况下,此文件不存在,因此将忽略该规则
你想要的是这样的东西:
$(OBJS): $(OBJDIR)/%.o: $(SOURCEDIR)/%.c
mkdir -p $(dir $@)
$(CP) $< $@
$(OBJS):$(OBJDIR)/%.o:$(SOURCEDIR)/%.c
mkdir-p$(dir$@)
$(CP)$<$@
规则$(OBJS):%.o:%.c
的意思是:尝试创建.o
文件时,如果相应的.c
文件存在,请使用此规则。例如:当make正在寻找创建$(OBJDIR)/foo.o
的方法时,它将寻找$(OBJDIR)/foo.c
在您的情况下,此文件不存在,因此将忽略该规则
你想要的是这样的东西:
$(OBJS): $(OBJDIR)/%.o: $(SOURCEDIR)/%.c
mkdir -p $(dir $@)
$(CP) $< $@
$(OBJS):$(OBJDIR)/%.o:$(SOURCEDIR)/%.c
mkdir-p$(dir$@)
$(CP)$<$@
lesmana,谢谢您的回复!实际上,是$(OBJS):$(OBJDIR)/%.o:../%.c@mkdir-p$(dir$@)$(CC)$(CFLAGS)$<-o$@完成了这项工作!谢谢!你帮了大忙!莱斯马纳,谢谢你的回复!实际上,是$(OBJS):$(OBJDIR)/%.o:../%.c@mkdir-p$(dir$@)$(CC)$(CFLAGS)$<-o$@完成了这项工作!谢谢!你帮了大忙!