6

我的印象是冒号的左侧:代表target可执行文件,而右侧代表“依赖项”,即生成所述目标所需的文件。

hello : hello.c
    gcc hello.c -Wall -o hello

所以,我认为目标“你好”是最终可执行文件的名称。

executableHelloWorldFile : hello.c
    gcc hello.c -Wall -o hello

但是,当我将“hello”更改为“executableHelloWorldFile”时,输出没有任何变化。

我知道如何创建目标,但在这里我想了解targetMakefile 有什么帮助?

4

5 回答 5

11

首先,假定 Target 是一个文件,如果该文件不存在或它的时间戳晚于它的任何依赖项,则重新制作该文件。如果您将目标名称从实际文件名更改为随机名称,您的目标将始终被重新制作,因为您用来欺骗 make 的任意文件不存在,并且在 make 运行您指定的命令时不会创建它。

编辑:你的编译器不知道 make 调用它,它完全按照你给它的指令执行(就像每个计算机程序都应该做的那样)。如果你说'-o hello',它会将二进制文件写入文件'hello',而不管你想出的虚假目标名称如何。

于 2012-07-02T06:30:38.150 回答
3

Amake target基本上是您要重建的文件。

Make 无法预测您想要构建什么,因此您必须隐含或明确地告诉它应该构建什么。通常,文件中的第一个目标是一个名称,例如“all”,如果您在没有任何明确目标的情况下运行“make”,它将构建 makefile 中列出的第一个目标。但是,一些 makefile 没有指定任何目标;那么您必须在命令行上指定一个。或者,如果您不想构建默认目标,则必须指定您想要构建的目标。

A makefile will usually include code to make your program, install your program, clean up afterward, and other things.

so the word target could be various keywords, such as all, install, clean, etc.

It's a way of saying make something. make all implies do everything

于 2012-07-02T06:34:24.797 回答
2
  1. 是的,在您的示例中,目标“hello”恰好导致构建 .exe“hello”。

  2. 但是不,您可以触发目标的任何操作(或操作组合)。

    例如,“make clean”、“make build”、“make install”和“make all”都是常用命令。他们触发 makefile 以 1) 清理任何已经构建的“垃圾”,2) 重新编译项目,3) 安装项目或 4) 做所有事情

  3. 要回答您的问题,“目标”只是告诉生成文件“做某事”的一种方式。

    在您的示例中,目标将调用“gcc”。但当且仅当源文件“hello.c”已过期时,它才会调用它。

  4. makefile 通常由许多目标、规则和定义组成。

    一个组件通常由多个子项目组成,每个子项目都有自己的 makefile。

'希望有帮助.. PSM

于 2012-07-02T06:33:04.697 回答
1

您需要在规则中使用适当的变量:$@目标$^是依赖项。在您的情况下,这应该是:

executableHelloWorldFile : hello.c
    gcc $^ -Wall -o $@

或者当您只需要引用第一个依赖项时,请使用$<

executableHelloWorldFile : hello.c
    gcc $< -Wall -o $@
于 2012-07-02T06:31:12.187 回答
1

make 执行你给它的命令。如果该命令没有创建目标,那是你写错命令的错。显着的区别是,如果您正确指定了目标,您可以连续运行两次 make,第二次它会知道目标是最新的并且不需要重新构建。当目标实际上不是由命令创建时,如果您连续运行两次 make,第二次将不必要地重新运行该命令。

某些目标(如allclean)通常包含在 Makefile 中,但实际上并不是现有文件。它们代表用户可以使用命令请求的更大操作,例如make clean每次都必须运行命令。

于 2012-07-02T06:33:20.970 回答