我对这个表达式有疑问:
%.out: %.cpp Makefile
g++ $< -o $@ -std=c++0x
这是什么意思?我知道,它是* .o文件的定义目标,但它是什么意思%.cpp Makefile
和$<
以及$@
?
和
以下是什么区别:
all: $(patsubst %.cpp, %.o, $(wildcard *.cpp))
和
all:
$(patsubst %.cpp, %.o, $(wildcard *.cpp))
第二个不起作用。
答案 0 :(得分:1)
问题的第一部分:
%.out: %.cpp Makefile
g++ $< -o $@ -std=c++0x
这是pattern rule,意思是:&#34;对于扩展名为.cpp的所有文件,使用命令g++ $< -o $@ -std=c++0x
编译(如果需要)相应的.out文件
在这一行中,$<
是先决条件(.cpp文件),$@
是目标的名称(.out文件)。 See here
该规则还将makefile本身作为先决条件添加,这意味着当您发出make target
命令时,如果对makefile进行更改,将重建所有文件(即使它们已经被编译)。
对于问题的第二部分,你正在混合两件事。制定规则由三部分组成:
target: dependencies
commands
您显示的第二个无法正常工作,因为没有命令。该行只生成一堆文件名,你的shell无法理解。
第一个将所有目标文件添加到依赖项列表中,其名称从所有.ccp文件中推导出来。但你错过了一个命令,所以什么都不应该发生(除非你没有给我们整个规则?)
编辑:哎呀,错过了什么,这个规则实际上应该可以正常工作,因为make将评估所有先决条件目标,从而调用上面描述的模式规则。我对这个结构通常写成这样的事实感到困惑:
targetname: $(OUTFILES)
@echo "- Done target $@"
使用上面定义的变量:
OUTFILES = $(patsubst %.cpp, %.o, $(wildcard *.cpp))
甚至是:
INFILES = $(wildcard *.cpp)
OUTFILES = $(patsubst %.cpp, %.o, $(INFILES))
我建议你找一个好的制作教程,或者read the manual,你似乎有很多要学习的概念......