在我的makefile中需要帮助来编译源代码

时间:2013-10-10 09:29:02

标签: makefile gnu-make

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

03-Specific_sources中有一些.c和.h文件,有一个.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

所以我认为mathing模式%.r34不起作用,当我使用
时 ($(OBJDIR_RELEASE)/%。r34:$(FIND_SRCS)/%。c)它也无效,因为我不能使用%
使用在其上执行通配符功能的变量。

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

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

提前致谢 SAM

1 个答案:

答案 0 :(得分: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
...

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