0

我有 2 个文件夹及其子文件夹 04-Software Components / 03-Specific_sources 和 08-Ext_Proj / SWC_ADC, SWC_PWM / 03-SRC

在 03-Specific_sources 中有一些 .c 和 .h 文件,在 SWC_ADC / 03-SRC(即 ADC.c)和 SWC_PWM / 03-SRC(即 PWM. C)

我想编译它们并将它们全部链接以获得输出文件。所以我所做的是:

EXEDIR_RELEASE := ../01-EXE\02-Release
OBJDIR_RELEASE := ../05-Obj\02-Release
SRCDIR := ../../../03-Specific_sources (This is the path from my make folder)

EXT_DIR  := ../../08-Ext_Proj (This is the path from my make folder)
FIND_SRCS := $(wildcard $(EXT_DIR)/SWC_*/03-SRC/*.c)

INCLUDES := -I $(SRCDIR) $(foreach ext, $(wildcard $(EXT_DIR)/SWC*), -I $(ext)/03-SRC)

CSRCS := $(wildcard $(SRCDIR)/*.c) $(FIND_SRCS)
CSRCS := $(notdir $(CSRCS))

CROBJS := $(patsubst %.c, %.r34, $(CSRCS))
CROBJS := $(addprefix $(OBJDIR_RELEASE)/, $(CROBJS))

.PHONY: all 

all: $(EXEDIR_RELEASE)/$(TARGET_RELEASE)

# Compiling
$(OBJDIR_RELEASE)/%.r34: $(FIND_SRCS)
        @echo '$^ $@'
    $(CC) $(CFLAGS) $(INCLUDES) -o $@ $<

# Linking
$(EXEDIR_RELEASE)/Target.mot: $(CROBJS)
    $(LD) $(MFLAGS) # These are the linker and its flags

问题是编译不起作用。所以当我做回声时,我得到了这个:

ADC_prg.c PWM_prg.c DDF_prg.r34
ADC_prg.c PWM_prg.c DFAN_prg.r34
ADC_prg.c PWM_prg.c DFN_prg.r34
ADC_prg.c PWM_prg.c DIO_prg.r34
ADC_prg.c PWM_prg.c DMIO_prg.r34

所以我认为数学模式 %.r34 不起作用,当我使用
($(OBJDIR_RELEASE)/%.r34: $(FIND_SRCS)/%.c) 它也不起作用,因为我不能将 %
与变量一起使用对其执行通配符功能。

我也使用了 foreach 函数,但没有用。

所以,我需要你们的帮助,我今天有交货......请尽快回复。

在此先感谢 SAM

4

1 回答 1

0

这个makefile有很多问题。尤其:

$(OBJDIR_RELEASE)/%.r34: $(FIND_SRCS)
    @echo '$^ $@'
    $(CC) $(CFLAGS) $(INCLUDES) -o $@ $<

此模式规则在先决条件列表中没有通配符 ("%")。任何r34 目标依赖于$(FIND_SRCS). 如果这还不够糟糕,请查看这些变量的来源:

SRCDIR := ../../../03-Specific_sources (This is the path from my make folder)

EXT_DIR  := ../../08-Ext_Proj (This is the path from my make folder)
FIND_SRCS := $(wildcard $(EXT_DIR)/SWC_*/03-SRC/*.c)

...

CSRCS := $(wildcard $(SRCDIR)/*.c) $(FIND_SRCS)
CSRCS := $(notdir $(CSRCS))

CROBJS := $(patsubst %.c, %.r34, $(CSRCS))
CROBJS := $(addprefix $(OBJDIR_RELEASE)/, $(CROBJS))

换句话说,您似乎期望对于一个目录中的每个源文件,在另一个目录中都会有一个同名文件。根据你的echo说法,没有这样的匹配。

还有其他问题,但这是一个很好的起点。尝试这个:

CSRCS := $(wildcard $(SRCDIR)/*.c) $(EXT_DIR)/SWC_ADC/03-SRC/ADC.c $(EXT_DIR)/SWC_PWM/03-SRC/PWM.c
CSRCS := $(notdir $(CSRCS))
CROBJS := $(patsubst %.c, $(OBJDIR_RELEASE)/%.r34, $(CSRCS))

vpath %.c $(SRCDIR) $(EXT_DIR)/SWC_ADC/03-SRC $(EXT_DIR)/SWC_PWM/03-SRC

$(OBJDIR_RELEASE)/%.r34: %.c
    $(CC) $(CFLAGS) $(INCLUDES) -o $@ $<

向下查看您要构建的目标文件列表,并尝试构建每一个:

make DDF_prg.r34
make DFAN_prg.r34
...

如果可行,请尝试手动链接它们,如果可行,请查看链接规则——这看起来完全错误,但我无法真正诊断,因为我不知道您使用的是什么链接器。

于 2013-10-10T23:41:53.267 回答