【问题标题】:makefile: No rule to make target '%.o'makefile: 没有规则来制作目标'%.o'
【发布时间】:2020-04-03 20:25:40
【问题描述】:

我有 3 个文件: Source.cpp 2ndfile.cpp 2ndfile.hpp 我正在尝试用 mingw32-make 编译它们

ma​​kefile 不起作用:

all: launch.exe

launch.exe: %.o
    g++ -o $@ $^

%.o: %.cpp
    g++ -c $< -std=gnu++11

有效的生成文件:

all: launch.exe

launch.exe: source.o 2ndfile.o
    g++ -o $@ $^

source.o: source.cpp
    g++ -c source.cpp -std=gnu++11

2ndfile.o: 2ndfile.cpp
    g++ -c 2ndfile.cpp -std=gnu++11

我的问题是:为什么第一个不起作用? '%' 模式有什么问题? 我得到的错误:mingw32-make: *** No rule to make target '%.o', needed by 'launch.exe'. Stop.

【问题讨论】:

    标签: gcc makefile g++ mingw


    【解决方案1】:

    我的问题是:为什么第一个不起作用? '%' 模式有什么问题?

    模式规则通过名称中的公共元素(由% 通配符表示)将目标与先决条件匹配。你以这条规则的形式展示你自己的例子:

    %.o: %.cpp
        g++ -c $< -std=gnu++11
    

    另一方面,这条规则...

    launch.exe: %.o
        g++ -o $@ $^
    

    ... 不是模式规则,因为目标名称不包含%。在那里,您似乎试图以完全不同的方式使用%,类似于全局模式中的*。即使在模式规则中,它也不能达到这个目的。这将赋予模式规则一个非常不同(而且用处更少)的含义。相反,在您的非模式规则中,% 被视为普通字符。

    编写 makefile 的方法有很多种,但探索模式规则的一个好的、简单的模型将是您的第一个和第二个示例的组合:

    all: launch.exe
    
    launch.exe: source.o 2ndfile.o
        g++ -o $@ $^
    
    %.o: %.cpp
        g++ -c $< -std=gnu++11
    

    【讨论】:

    • mingw32-make: *** 没有规则来制作目标“source.o”,“launch.exe”需要。停止。
    • 那么要么你没有使用GNU make,要么文件source.cpp不在工作目录中,@vamirio-chan
    • 但是第二个例子有效(它具有文件的确切名称)。此外,如果您将 % 替换为 * 它也可以。我在带有文件的目录中使用“mingw32-make”命令。编辑:发现我的错误:来源 - >来源。您的建议与目标有所帮助,谢谢。
    • 我提供的示例 makefile 对我来说很好用,@vamirio-chan,带有虚拟源文件。
    【解决方案2】:

    用 * 代替 %。

    all: launch.exe
    
    launch.exe: *.o
        g++ -o $@ $^
    
    *.o: *.cpp
        g++ -c $^ -std=gnu++11
    

    编辑:下面有一个答案,为什么这是一个坏主意。以下是有效的:

    all: launch.exe
    
    launch.exe: Source.o 2ndfile.o
        g++ -o $@ $^
    
    %.o: %.cpp
        g++ -c $^ -std=gnu++11
    

    【讨论】:

    • 这是一个糟糕的建议,因为它可能会拾取您想要的目标文件以外的目标文件,并且它在第一次构建或任何需要的时候都不起作用 .o 文件被删除。
    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    相关资源
    最近更新 更多