【问题标题】:GNU make Pattern Rule Fails with 'Main.cpp"GNU make 模式规则因“Main.cpp”而失败
【发布时间】: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


    【解决方案1】:

    麻烦的是这条规则:

    obj/%.o: src/%.cpp %.d hdr/%.h
        echo $@
        $(CXX) $(INCLUDES) -o $@ -c $< $(ROOTFLAGS)
    

    需要相应的头文件。我怀疑没有hdr/main.h,Make 没有办法构建它,所以当它在寻找构建obj/main.o 的方法时,它会考虑这条规则,拒绝它,然后找不到其他规则。

    我建议你添加另一个模式规则(这个之后)来处理没有匹配头文件的源文件:

    obj/%.o: src/%.cpp %.d
        echo $@
        $(CXX) $(INCLUDES) -o $@ -c $< $(ROOTFLAGS)
    

    (P.S. 你的依赖处理有点奇怪,而且似乎是退化的——你生成依赖文件并且从不使用它们。一旦你正确构建 main.o,我们可以帮助你。)

    【讨论】:

    • 啊,非常感谢!添加规则可以解决问题 - 事实证明,当我将 main.cpp 重命名为 test.cpp 时,首先查看了另一个以 s 开头的文件,该文件编译失败,因此我从未看到“无匹配规则”错误test.o 并认为问题已解决。我很乐意为依赖文件提供帮助。我以为我正确地使用了它们,但也许不是。
    • 我应该补充一点,我从找到的 here 改编了我的 Makefile
    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    相关资源
    最近更新 更多