Makefile文件。特别的字符

时间:2016-04-16 19:52:57

标签: makefile

我对这个表达式有疑问:

%.out: %.cpp Makefile
    g++ $< -o $@ -std=c++0x

这是什么意思?我知道,它是* .o文件的定义目标,但它是什么意思%.cpp Makefile$<以及$@

以下是什么区别:

all: $(patsubst %.cpp, %.o, $(wildcard *.cpp))

all: 
     $(patsubst %.cpp, %.o, $(wildcard *.cpp))

第二个不起作用。

1 个答案:

答案 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,你似乎有很多要学习的概念......