这些Makefile结构是什么意思?
有人可以帮我弄清楚下面的make文件吗?这些Makefile结构是什么意思?
BINS=file1 file2 file3
all: $(BINS)
clean:
rm -f $(BINS) *~
$*: [email protected]
gcc -g -o [email protected] $?
这里是我的问题:
- 什么是gcc的-g选项?
- 什么是$ *和$ @
- 它是如何知道执行最后一个目标的?
谢谢!
从gcc
和make
文档:
“-*生调试操作系统的本机格式的信息”。
-
a。 “$ *隐式规则匹配的词干(请参阅如何匹配模式)如果目标文件是dir/a.foo.b并且目标模式是。%。b,则词干是dir/foo。词干是用于构建相关文件的名称在静态模式规则中,词干是与目标模式中的'%'匹配的文件名的一部分。“
b。 “$ @规则目标的文件名如果目标是一个存档成员,那么'$ @'是存档文件的名称。在具有多个目标的模式规则中(请参阅模式规则简介), '$ @'是导致规则命令运行的任何目标的名称。“
c。 “$?所有比目标更新的先决条件的名称,它们之间有空格。” (不问,但值得添加。)
“'all'编译整个程序,这应该是默认目标。”
这个例子的makefile有点有限,因为它似乎只是构建C程序。 GNU make有几个更广泛的例子,对学习如何编写makefile有用。
1.)什么是gcc的-g选项?
生成调试信息
2)什么是$ *和$ @
$*
是规则的茎。当你排除像
%.ext: %.otherext
ext2otherext --input $? --output [email protected] --logfile $*.log
,以及规则试图使file.ext
从file.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] $?
Q1和Q2已经被广泛地回答,所以短暂的仅适用于Q3的说明:
使总是执行第一个目标,除非您指定了另一个目标。这也被称为默认目标。通常默认目标被称为“全部”。
第一行按照您期望的方式完成 - 它会创建一个名称列表并将其分配给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
选项只需启用调试信息被编译
你应该。给这个问题一个更好的名字。 – 2009-01-29 20:30:01
这是整个makefile? $ *作为目标非常奇怪 – Quassnoi 2009-01-29 20:57:26