Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 目标在Makefile中的角色是什么?_C_Linux_Makefile_Target - Fatal编程技术网

C 目标在Makefile中的角色是什么?

C 目标在Makefile中的角色是什么?,c,linux,makefile,target,C,Linux,Makefile,Target,我的印象是,冒号的左侧表示:目标,即可执行文件,右侧表示“依赖项”,即生成所述目标所需的文件 hello : hello.c gcc hello.c -Wall -o hello 因此,我认为目标“hello”是最终可执行文件的名称 executableHelloWorldFile : hello.c gcc hello.c -Wall -o hello 但是,当我将“hello”更改为“executableHelloWorldFile”时,输出中没有任何更改 我知道如何创建

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

hello : hello.c
    gcc hello.c -Wall -o hello
因此,我认为目标“hello”是最终可执行文件的名称

executableHelloWorldFile : hello.c
    gcc hello.c -Wall -o hello
但是,当我将“hello”更改为“executableHelloWorldFile”时,输出中没有任何更改


我知道如何创建目标,但在这里,我希望了解,
目标
在什么方面有助于生成文件?

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


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

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

executableHelloWorldFile : hello.c
    gcc $^ -Wall -o $@
或者,当您只需要引用第一个依赖项时,请使用
$
  • 是的,在您的示例中,目标“hello”碰巧导致生成.exe“hello”

  • 但是没有,你可以用目标触发任何动作(或动作组合)

    例如,“makeclean”、“makebuild”、“makeinstall”和“makeall”是常见的命令。它们触发makefile,1)清理已构建的任何“垃圾”,2)重新编译项目,3)安装项目,或4)执行所有操作

  • 为了回答您的问题,“target”只是告诉makefile“做点什么”的一种方式

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

  • 生成文件通常由许多目标、规则和定义组成

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


  • “希望有帮助。。PSM

    make执行您给它的命令。如果该命令没有创建目标,则是您编写了错误的命令。重要的区别在于,如果正确指定了目标,则可以连续运行make两次,第二次它将知道目标是最新的,不需要重建。当目标不是由命令实际创建时,如果连续运行make两次,第二次将不必要地重新运行该命令


    某些目标(如
    all
    clean
    )按惯例包含在makefile中,而不是实际存在的文件。它们代表更大的操作,用户可以通过命令请求,例如每次都必须运行命令。

    A
    make target
    基本上是一个您想要重建的文件

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

    makefile
    通常会包含制作程序、安装程序、事后清理等的代码

    因此,单词target可以是各种关键字,例如
    all、install、clean等


    这是一种表达“做某事”的方式。make all implies do everything

    您是否删除了hello.exe并重新编译了代码?@doniyor这不是问题,请参阅我的答案。target告诉我们该做什么,rule告诉我们该怎么做。不,“目标”不一定是文件。“全造”怎么样(例如)?你部分是对的。All是一个特殊的目标,但在这种特定情况下,目标被假定为一个文件。输出文件的名称为“hello”,因为您的规则是“-o hello”;)它不是“被覆盖的”。Makw不会对编译器做任何事情——如果使用“-o hello”,编译器将使用“-o hello”。如果要使用目标名称作为输出文件名,请改用
    -o$@
    。否-目标不一定是输出文件的名称!!!!那只是个惯例。还有一些元字符(比如$<和$*)支持这种约定。您说过“但只有在源文件“hello.c”过期时才会调用它。”这次我用空格编辑了hello.c。再次运行make,但输出文件的名称再次为“hello”,而不是“executableHelloWorldFile”。这是LinuxPS:doniyor的一句话绝对正确:“目标告诉你做什么,规则告诉你如何做”。@AnishaKaul你给出的输出文件名是hello,这就是为什么你将hello文件作为输出。executableHelloWorldFile是你的目标,而不是你的输出二进制文件名。@user1089679所以,这意味着目标与可执行文件的名称无关?Paul-我认为您应该添加“否-目标不一定是输出文件的名称!!!!这只是一个约定。还有一些元字符(例如$<和$*)支持该约定。”要使其完整,最后,目标名称不一定是输出文件的名称,但我们可以通过“$@”、“$^”等关键字为目标文件和输出文件指定相同的名称。@AnishaKaul不一定。你的理解是对的不!
    executableHelloWorldFile : hello.c
        gcc $< -Wall -o $@