我尝试制作一个通用的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
匹配,但似乎并非如此,我不明白为什么它不起作用
答案 0 :(得分:1)
尝试将./build
和./src
添加到您的规则中(包含在您的&#34;显式&#34;规则中,但不在您在Makefile中使用的变量中)。