【发布时间】:2014-05-05 20:07:49
【问题描述】:
我有一个通用的 makefile,我以前成功地用于小型(个人)项目,如下所示:
#Makefile to compile a folder's contents into a program.
PROGNAME := MyProgram
LIBRARIES :=
CXX := g++ --std=c++11
INCLUDES := -Isrc -Ihdr
VPATH := src:hdr
CPP_FILES := $(wildcard src/*.cpp)
OBJ_FILES := $(patsubst src/%.cpp,obj/%.o,$(CPP_FILES))
$(PROGNAME): $(OBJ_FILES)
$(CXX) $(INCLUDES) $(LIBRARIES) $^ -o $@ $(ROOTFLAGS)
#Automatically generate dependencies (-MM), change the target to be the
# object file (-MT) and output it to the dependency file (-MF).
%.d: src/%.cpp
$(CXX) $(INCLUDES) -MM -MT '$(patsubst src/%.cpp,obj/%.o,$<)' $< -MF $@
obj/%.o: src/%.cpp %.d hdr/%.h
echo $@
$(CXX) $(INCLUDES) -o $@ -c $< $(ROOTFLAGS)
.PHONY: clean
clean:
rm obj/*.o $(PROGNAME)
这是为以下目录结构设计的:
ParentFolder/
Makefile
hdr/
file1.h
...
src/
file1.cpp
...
obj/
我将 makefile 给了一位同事,但他们发现它不起作用 - 经过一番调查,问题的原因似乎是他们在 src/ 中有一个名为 main.cpp 的源文件,当运行 @ 987654325@ 会给出以下错误:
make: *** No rule to make target `obj/main.o', needed by `MyProgram'. Stop.
如果我将 main.cpp 重命名为其他名称(例如 test.cpp),则 makefile 将按预期工作。
这种行为的原因是什么?我查看了 GNU Make Manual,但没有找到任何关于对名为 main.* 的文件进行特殊处理的任何内容(事实上,一些示例使用它)。
在尝试解决问题时,我发现为 main.o 定义一个显式规则意味着它会被找到 - 因此,我认为这是与 main 名称和基于模式的规则的交互,但我有没能找到那可能是什么。
【问题讨论】:
标签: makefile