【发布时间】:2011-01-17 06:11:27
【问题描述】:
为什么我需要先创建make target 才能构建我的源代码?
更具体地说,make target 到底是什么?
【问题讨论】:
标签: build-process build makefile
为什么我需要先创建make target 才能构建我的源代码?
更具体地说,make target 到底是什么?
【问题讨论】:
标签: build-process build makefile
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 的内容。
一些目标是“假”目标,这意味着它们不对应于任何真实文件。 “全部”目标就是这种类型。 “干净”的目标 (make clean) 也是如此。等等。您实际上并不需要或不想构建一个名为“all”或“clean”的文件。有多种方法可以指定目标是假的。
Makefile 中出现的第一个目标是只要键入make 就会被调用的目标。一种约定是将此目标命名为“全部”。那么make 将与make all 相同。
【讨论】:
touch 的创建,其目的只是更新文件的修改日期,从而触发构建。
“制作目标”基本上是您要重建的文件。
Make 无法预测您想要构建什么,因此您必须隐含或明确地告诉它应该构建什么。通常,文件中的第一个目标是一个名称,例如“all”,如果您在没有任何明确目标的情况下运行“make”,它将构建 makefile 中列出的第一个目标。但是,一些 makefile 没有指定任何目标;那么您必须在命令行上指定一个。或者,如果您不想构建默认目标,则必须指定您想要构建的目标。
就 GNU make 而言,目标也可以是“假的”。也就是说,它是一个不存在的名称,并且规则不会创建它,但它(虚假目标)依赖于许多其他文件,这些文件确实具有与之关联的规则。实际上,“all”目标通常是虚假目标——在大多数目录中都没有名为“all”的文件。
【讨论】:
makefile 通常会包含用于制作程序、安装程序、之后进行清理和其他事情的代码。
所以target这个词可以是各种关键字,例如all、install、clean等。
这是一种表达方式做某事。 make all 暗示无所不能
【讨论】:
make all' 仅暗示(声明)“做必要的工作以确保'所有'都是最新的”。通常,人们编写 makefile 以便执行您想要的大部分操作(但它不会自动进行安装,例如)。但这只是一个约定。
make 是一种常用的开发工具,它检查源代码文件和由它们生成的目标代码之间的文件日期,并编译源代码较新的那个。它通过使用一个名为 makefile 的文件来完成此操作,该文件列出了需要比较的文件。
标准语法是make /f makefile myprog.exe
这表示使用 makefile 中的文件列表构建 myprog.exe。 makefile 默认为makefile.mak,因此如果您使用该名称,则不必在命令行中指定它。
myprog.exe 这里称为目标。一个技巧是您可以在 makefile 中放入一个不存在文件的构建指令列表。如果您然后说要构建该目标,它将运行这些命令。通常,您会看到类似 make clean 的内容,其中删除了临时文件。
【讨论】:
make 程序将接受该语法来执行我在下一段中描述的操作。 make 的变体有很多,所以我不能代表所有这些,但大多数人都会接受这种语法。
make 实际上有推荐的官方“标准”吗?
在现实生活中,当您想实现某事时,您通常将某事称为目标或目标。要达到该目标,通常您需要满足一些先决条件。
在计算机领域,目标具有相似的含义。它不一定限于构建软件。但在构建软件时经常会看到。
一个软件通常由很多组件组成。并且这些组件通常具有相互依赖关系。假设完全构建一个软件是你的最终目标。为了实现这一点,您需要根据它们的依赖关系构建组件。您可以将组件组织成一个层次结构,就像一棵树一样。而每个节点都是以根为最终目标的中间目标,通常命名为all。您可以为任何目标节点(中间节点或根节点)调用make。然后它的所有子目标都需要完成才能使目标节点完成。
对于每个目标,您需要指定为完成该目标而采取的行动。这些操作称为命令或规则。
引用here:
目标以特定顺序将任务组合在一起并允许构建 过程被分解成更小的单元。
【讨论】: