Makefile通用规则不起作用

时间:2014-05-22 10:53:15

标签: gcc makefile

我尝试制作一个通用的makefile,你提供了源文件和一些目录的名称,但是我无法获得目标文件的通用规则。

我的makefile是这样的:

SOURCE_NAMES=main
EXECUTABLE_NAME=Program

EXECUTABLE_DIR=./dist
EXECUTABLE_EXT=
SOURCE_DIR=./src
SOURCE_EXT=.cc
OBJECT_DIR=./build
OBJECT_EXT=.obj

COMPILER=gcc
COMPILER_FLAGS=-c -Wall -std=gnu++11
LINKER_FLAGS=

SOURCES=$(addsuffix $(SOURCE_EXT),$(addprefix $(SOURCE_DIR)/,$(SOURCE_NAMES)))
OBJECTS=$(addsuffix $(OBJECT_EXT),$(addprefix $(OBJECT_DIR)/,$(SOURCE_NAMES)))
EXECUTABLE=$(EXECUTABLE_DIR)/$(EXECUTABLE_NAME)$(EXECUTABLE_EXT)

all: $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(COMPILER) $(LINKER_FLAGS) $(OBJECTS) -o $@

%$(OBJECT_EXT): %$(SOURCE_EXT)
    $(COMPILER) $(COMPILER_FLAGS) $< -o $@

然而,从我得到的错误判断,最终规则%$(OBJECT_EXT): %$(SOURCE_EXT)似乎无法正常工作:

  

make:*** Er is geen regel om doel&#39; build / main.obj&#39; te maken,nodig voor&#39; dist / RandomGenerator&#39;。 Gestopt。

转换为:

  

制作:***没有规则可以制作&#39; dist / RandomGenerator&#39;所需的目标&#39; build / main.obj&#39;。停止。

当我明确地编写规则时,它确实有效:

./build/main.obj: ./src/main.cc
    $(COMPILER) $(COMPILER_FLAGS) $< -o $@

但我宁愿不为每个源文件明确地这样做。

我该如何解决这个问题?

修改

为了清楚起见,这个问题是为什么我的makefile末尾的通用规则不起作用。我希望./build/main.obj%$(OBJECT_EXT)%.obj匹配,但似乎并非如此,我不明白为什么它不起作用

1 个答案:

答案 0 :(得分:1)

尝试将./build./src添加到您的规则中(包含在您的&#34;显式&#34;规则中,但不在您在Makefile中使用的变量中)。