如何解决Makefile镜像构建目录
| 我需要创建用于编译带有许多子目录的.c文件的Makefile(源目录的深度大约为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)/%,$@)
如果我以此方式为$(OBJS)
定义规则,则$<
始终是$(CSRC)
中的第一个.c文件。
如果我这样定义$(OBJS)
:
$(OBJS): %.o: %.c
mkdir -p $(dir $@)
$(CP) $< $@
我收到错误,没有任何规则可以将.c文件作为目标。但是我看到make正在构建镜像目录中寻找.c文件,并且它应该查看源目录。您可能知道如何安排吗?
预先谢谢您!
解决方法
规则“ 6”的含义如下:尝试创建“ 7”文件时,如果存在相应的“ 8”文件,请使用此规则。例如:当make正在寻找一种创建
$(OBJDIR)/foo.o
的方法时,它将寻找$(OBJDIR)/foo.c
。
您的情况下该文件不存在,因此该规则将被忽略。
您想要的是这样的东西:
$(OBJS): $(OBJDIR)/%.o: $(SOURCEDIR)/%.c
mkdir -p $(dir $@)
$(CP) $< $@
,您尝试的“ 1”的第一条规则指出,每个目标文件分别取决于所有源文件。当然,这是不正确的。
尽管配方很奇怪,但是您的第二次尝试更好。解决该问题,然后使用VPATH
使make
查找源。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。