为什么在编译源代码之前我需要制定一个make target
?
更具体地说,make target究竟是什么?
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,all目标就被满足了。
目标通常只是文件。块的格式为:
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
在shell中表示的是 *.c
。
有些目标是“虚拟”目标,意思是它们不对应任何真实文件。其中 "all" 目标就是这种类型的,"clean" 目标 (make clean
) 也是如此。你实际上不需要或者想要构建一个名为 "all" 或 "clean" 的文件。有多种方式可以指定目标是虚拟的。
出现在 Makefile 中的第一个目标将是如果你只输入 make
命令时调用的那个目标。一种约定是将该目标命名为 "all"。因此 make
命令将与 make all
命令相同。
makefile
通常包含编译程序、安装程序、清理工作等代码。
因此,target
这个词可以是各种关键字,比如all
、install
、clean
等。
这是一种说“做某事”的方式。make all
意味着做所有事情。
make all
”只是暗示(声明)“完成必要的工作以确保‘all’是最新的”。通常情况下,人们编写Makefile以执行大部分所需操作(但例如不会自动安装)。但这只是一种约定。 - Jonathan Lefflermake
是一种常见的开发工具,它检查源代码文件和从中生成的目标代码之间的文件日期,并编译其中源代码更新的文件。它通过使用一个名为 makefile 的文件来实现这一点,该文件列出需要进行比较的文件。
标准语法是 make /f makefile myprog.exe
这意味着使用 makefile 中的文件列表构建 myprog.exe。makefile 默认为 makefile.mak
,因此如果您使用该名称,则不必在命令行上指定它。
这里的 myprog.exe
被称为目标。一个技巧是,您可以在 makefile 中放置一个不存在文件的构建指令列表。如果您然后说要构建该目标,它将运行这些命令。通常,您会看到类似于 make clean
的东西,它会删除临时文件。
make
呢? - Pacerier在现实生活中,当你想要实现某些事情时,通常会称之为目标或者目的。为了达到这个目标,通常需要先完成一些前提条件。
在计算机领域,目标也有类似的含义。它不一定局限于构建软件,但在构建软件时经常出现。
一个软件通常由许多组件组成,而这些组件通常具有相互依赖关系。假设完全构建一个软件是您的最终目标,为了实现这个目标,您需要根据它们的依赖关系构建组件。您可以将这些组件组织成一个层次结构,就像一棵树一样。每个节点都是一个中间目标,根节点是最终目标,通常被命名为all。您可以针对任何目标节点(中间或根)调用make
,然后需要完成所有子目标才能使目标节点完成。
对于每个目标,您需要指定完成该目标所需执行的操作。这些操作称为命令或规则。
引用自此处的一些话:
目标将组任务按特定顺序分组,并允许构建过程分解为较小的单元。
touch
的创建,其目的仅是更新文件的修改日期,以触发构建。 - James Curran