我的印象是冒号:
的左侧代表target
即可执行文件,而右侧代表'依赖',即生成所述文件所需的文件目标。
hello : hello.c
gcc hello.c -Wall -o hello
所以,我认为目标'hello'是最终可执行文件的名称。
executableHelloWorldFile : hello.c
gcc hello.c -Wall -o hello
但是,当我将'hello'更改为'executableHelloWorldFile'时,输出中没有任何变化。
我知道如何创建目标,但是在这里我想了解一下target
对Makefile有什么帮助?
答案 0 :(得分:4)
首先,目标被假定为文件,如果不存在或其时间戳晚于其任何依赖项,则重新生成。如果将目标名称从实际文件名更改为随机名称,则目标将始终重新制作,因为您所愚弄的任意文件不存在,并且当make运行您指定的命令时不会创建它。
编辑:你的编译器不知道make调用它,它完全执行你给它的指令(因为每个计算机程序都应该这样做)。如果你说'-o hello',它会将二进制文件写入文件'hello',而不管你想出的虚假目标名称。
答案 1 :(得分:2)
是的,在您的示例中,目标“hello”恰好导致构建.exe“hello”。
但不,您可以触发目标的任何操作(或操作组合)。
例如,“make clean”,“make build”和“make install”以及“make all”是常用命令。它们触发makefile以1)清理已经构建的任何“垃圾”,2)重新编译项目,3)安装项目或4)做所有事情
要回答你的问题,“目标”只是告诉makefile“做某事”的一种方式。
在您的示例中,目标将调用“gcc”。但如果 - 并且只有 - 源文件“hello.c”已过期,它将调用它。
makefile通常由许多目标,规则和定义组成。
组件通常由多个子项目组成,每个子项目都有自己的makefile。
'希望有所帮助.. PSM
答案 2 :(得分:1)
您需要在规则中使用适当的变量:$@
目标$^
是依赖项。在你的情况下,这应该是:
executableHelloWorldFile : hello.c
gcc $^ -Wall -o $@
或者当您只需要引用第一个依赖项时,请使用$<
:
executableHelloWorldFile : hello.c
gcc $< -Wall -o $@
答案 3 :(得分:1)
make执行你给它的命令。如果该命令没有创建目标,则写入错误命令是你的错。重要的区别在于,如果正确指定了目标,则可以连续运行make两次,并且知道第二次目标是最新的并且不需要重建。当命令实际上没有创建目标时,如果你连续两次运行make,第二个将不必要地重新运行命令。
某些目标(如all
和clean
)通常包含在Makefile中,而实际上并不是现有文件。它们代表了用户可以使用make clean
等命令请求的更大操作,每次都必须运行命令。
答案 4 :(得分:1)
make target
基本上是您想要重建的文件。
Make无法理解您想要构建的内容,因此您必须隐式或明确地告诉它应该构建什么。通常,文件中的第一个目标是诸如“all”之类的名称,如果运行'make'而没有任何显式目标,它将构建makefile中列出的第一个目标。但是,一些makefile没有指定任何目标;那么你必须在命令行中指定一个。或者,如果您不希望构建默认目标,则必须指定要构建的目标。
makefile
通常会包含制作程序,安装程序,后续清理以及其他内容的代码。
所以单词target可以是各种关键字,例如all, install, clean, etc
。
这是一种说出某种东西的方式。让所有意味着做一切