为什么我需要在构建源代码之前创建make target
?
更具体地说,究竟是什么make target?
答案 0 :(得分:24)
Makefile看起来像这样:
all: mybinary
mybinary: files.o it.o depends.o on.o
[tab]$(CC) $(CFLAGS) files.o it.o depends.o on.o -o mybinary
files.o: files.c files.h
[tab]$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@
...
这意味着,当您键入make all
(简写只是键入make
)时,它将确保mybinary目标或文件是最新的。要做到这一点,它需要确保mybinary比所有files.o it.o depends.o和on.o更新。如果没有,那么它使用下一行指定的shell命令来构建mybinary。但在此之前,它首先确保files.o等是最新的。这意味着它们必须比files.c和files.h更新。如果没有,那么它使用下一行指定的shell命令来构建files.o。一旦所有* .o文件都是最新的,它就可以构建mybinary。一旦构建了mybinary,就会满足所有目标。
目标通常只是文件。块的格式为:
target: list of dependency files
[tab]shell commands to build target if it's older than any of its dependencies
[tab]more shell commands
[tab]still more
还可以使用通配符指定目标,例如%.c
表示您要调用*.c
的shell中的内容。
某些目标是“虚假”目标,这意味着它们与任何真实文件都不对应。 “所有”目标就是这种。 “清洁”目标(make clean
)也是如此。等等。您并不真正需要或想要构建名为“all”或“clean”的文件。有多种方法可以指定目标是虚假的。
出现在Makefile中的第一个目标是只需键入make
即可调用的目标。一种惯例是将此目标命名为“全部”。因此,make
将与make all
相同。
答案 1 :(得分:5)
'make target'基本上是您想要重建的文件。
Make无法理解您想要构建的内容,因此您必须隐式或明确地告诉它应该构建什么。通常,文件中的第一个目标是诸如“all”之类的名称,如果运行'make'而没有任何显式目标,它将构建makefile中列出的第一个目标。但是,一些makefile没有指定任何目标;那么你必须在命令行中指定一个。或者,如果您不希望构建默认目标,则必须指定要构建的目标。
就GNU make而言,目标也可以是“假的”。也就是说,它是一个不存在的名称,并且规则不会创建它,但它(虚假目标)依赖于许多其他具有与之关联的规则的文件。实际上,'all'目标通常是假目标 - 大多数目录中都没有名为'all'的文件。
答案 2 :(得分:2)
makefile
通常会包含制作程序,安装程序,后续清理以及其他内容的代码。
所以单词target
可以是各种关键字,例如all
,install
,clean
等。
这是一种说法某事的方式。 make all
暗示做所有事情
答案 3 :(得分:1)
make
是一个常见的开发工具,它检查源代码文件和从它们生成的目标代码之间的文件日期,并编译源更新的文件。它通过使用一个名为makefile的文件来完成此操作,该文件列出了需要比较的文件。
标准语法为make /f makefile myprog.exe
这就是说使用makefile中的文件列表构建myprog.exe。 makefile默认为makefile.mak
,因此如果您使用该名称,则不必在命令行中指定它。
myprog.exe
这里被称为目标。一个技巧是你可以在makefile中输入一个不存在的文件的构建指令列表。如果您说要构建该目标,它将运行这些命令。通常,您会看到类似make clean
的内容,其中包含临时文件已删除。