我有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.
用*代替%。
all: launch.exe
launch.exe: *.o
g++ -o $@ $^
*.o: *.cpp
g++ -c $^ -std=gnu++11
我的问题是:为什么第一个不起作用? “%”模式有什么问题?
模式规则通过目标名称中的公共元素(由%
通配符表示)将目标与先决条件进行匹配。您以此规则的形式展示自己的示例:
%.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