makefile:没有规则可以使目标'%.o'

问题描述 投票:0回答:2

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

makefile无效:

all: launch.exe

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

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

makefile起作用:

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
2个回答
0
投票

用*代替%。

all: launch.exe

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

*.o: *.cpp
    g++ -c $^ -std=gnu++11

0
投票

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

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

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

另一方面,此规则...

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

...是not一个模式规则,因为目标名称不包含%。那里,您似乎在尝试以完全不同的方式使用%,类似于在glob模式中使用*。即使在模式规则中,它也达不到这个目的。这将给模式规则带来非常不同的含义(并且用处不大)。相反,在您的非模式规则中,%被视为普通字符。

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

all: launch.exe

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

%.o: %.cpp
    g++ -c $< -std=gnu++11
© www.soinside.com 2019 - 2024. All rights reserved.