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

我需要创建一个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-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$@完成了这项工作!谢谢!你帮了大忙!