2009-01-29 103 views
4

有人可以帮我弄清楚下面的make文件吗?这些Makefile结构是什么意思?

BINS=file1 file2 file3 

all: $(BINS) 

clean: 
     rm -f $(BINS) *~ 

$*: [email protected] 
     gcc -g -o [email protected] $? 

这里是我的问题:

  1. 什么是gcc的-g选项?
  2. 什么是$ *和$ @
  3. 它是如何知道执行最后一个目标的?

谢谢!

+0

你应该。给这个问题一个更好的名字。 – 2009-01-29 20:30:01

+0

这是整个makefile? $ *作为目标非常奇怪 – Quassnoi 2009-01-29 20:57:26

回答

5

gccmake文档:

  1. “-g产生调试操作系统的本机格式的信息”。

  2. a。 “$ *隐式规则匹配的词干(请参阅如何匹配模式)如果目标文件是dir/a.foo.b并且目标模式是。%。b,则词干是dir/foo。词干是用于构建相关文件的名称在静态模式规则中,词干是与目标模式中的'%'匹配的文件名的一部分。“

    b。 “$ @规则目标的文件名如果目标是一个存档成员,那么'$ @'是存档文件的名称。在具有多个目标的模式规则中(请参阅模式规则简介), '$ @'是导致规则命令运行的任何目标的名称。“

    c。 “$?所有比目标更新的先决条件的名称,它们之间有空格。” (不问,但值得添加。)

  3. “'all'编译整个程序,这应该是默认目标。”

这个例子的makefile有点有限,因为它似乎只是构建C程序。 GNU make有几个更广泛的例子,对学习如何编写makefile有用。

2

1.)什么是gcc的-g选项?

生成调试信息

2)什么是$ *和$ @

$*是规则的茎。当你排除像

%.ext: %.otherext 
    ext2otherext --input $? --output [email protected] --logfile $*.log 

,以及规则试图使file.extfile.otherext,然后登录进入file.log

[email protected]是目标文件名(file.ext在上述情况下)。

3.)如何知道执行最后一个目标?

这是一个谜。

$*用于中间文件:喜欢,当你试图使%.so%.c,你需要一个中介%.o既不是目标,也不是一个来源。你把:

%.so: %.c 
    gcc -fPIC -g -c -o $*.o $? 
    ld -shared -o [email protected] $*.o 

换句话说,在%.extension规则,$*是一切,但.extension

作为目标,$*是没有意义的。

您确定此规则实际上在某处执行吗?当我尝试使用你的Makefile重现它,它会应用默认的规则(cc -o),而不是gcc -g -o

规则,你需要似乎是:

%: %.c 
    gcc -g -o [email protected] $? 
0

Q1和Q2已经被广泛地回答,所以短暂的仅适用于Q3的说明:

使总是执行第一个目标,除非您指定了另一个目标。这也被称为默认目标。通常默认目标被称为“全部”。

1

第一行按照您期望的方式完成 - 它会创建一个名称列表并将其分配给BIN。接下来,定义一个名为all的制定目标,该制定目标取决于$BIN中列出的目标(all在构建$BIN中的每个目标之前都不能构建)。 all是一个特殊的构建目标;如果您只运行make而不是比如说make clean,则all目标会自动生成。没有与all关联的实际命令 - 它只是确保所有依赖关系都已建立。最后一个相当简单的命令定义了一个名为clean的构建目标,它删除$BIN中列出的每个文件(注意,$BIN既用作构建目标列表,又用作此生成文件中的文件列表)以及所有备份。

接下来,我们得到一个基本上是魔法的线。 $*是一个特殊的构建目标,意思是“没有特别定义的东西”。当make尝试构建all时,它会找到目标并开始处理其依赖关系。但是当它试图构建file1时,没有明确的目标定义。相反,它使用$*来构建file1。同样,[email protected]被替换为构建目标的名称,$?及其依赖关系(排序;你最好检查手册)。当make去建立file1,届时,$*规则使之产生如同以下规则进行定义:

file1: file1.c 
     gcc -g -o file1 file1.c 

最后,-g选项只需启用调试信息被编译