Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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
Makefile 脚本和生成文件之间有什么区别?_Makefile - Fatal编程技术网

Makefile 脚本和生成文件之间有什么区别?

Makefile 脚本和生成文件之间有什么区别?,makefile,Makefile,我发现它们都是用于在MCU中编译的配置文件,但何时何地使用哪个?脚本是一个解释过的计算机程序。也就是说,可以由另一个程序(称为解释器的可执行文件)执行的程序,无需先翻译成另一种语言。用特定语言编写的脚本需要理解该语言的解释器 生成文件是一个脚本。它由Make的某些版本进行解释。makefiles语言设计用于构建系统,调用shell命令从其他文件构建文件。它可以做其他事情,但通常不像其他更通用的语言那样容易,或者设计时考虑到了这些事情 何时何地使用哪种工具是一个非常广泛的问题。广义地说,Make是

我发现它们都是用于在MCU中编译的配置文件,但何时何地使用哪个?

脚本是一个解释过的计算机程序。也就是说,可以由另一个程序(称为解释器的可执行文件)执行的程序,无需先翻译成另一种语言。用特定语言编写的脚本需要理解该语言的解释器

生成文件是一个脚本。它由Make的某些版本进行解释。makefiles语言设计用于构建系统,调用shell命令从其他文件构建文件。它可以做其他事情,但通常不像其他更通用的语言那样容易,或者设计时考虑到了这些事情

何时何地使用哪种工具是一个非常广泛的问题。广义地说,Make是一个从其他文件构建文件并使其保持最新的好工具。其他语言可能更好地用于其他目的,如计算、流编辑或正则表达式处理。

的答案是完美的。让我们来看看make,一个很好的比喻是厨师。当被要求烹饪一顿饭(目标)时,它会阅读一本烹饪书(makefile),识别配料(文件)、正确的操作顺序及其描述

make的一个重要方面是,它比较文件的上次修改时间,以确定特定文件是最新的还是应重新生成。典型的makefile包含一系列规则(顺序通常不重要),如下所示:

target_file: prerequisite_file_1 prerequisite_file_2 ...
    recipe_line_1
    recipe_line_2
    ...
(其中每个配方行以一个选项卡开始)。这部分告诉make
target\u file
依赖于
prerequisite\u file\u 1
prerequisite\u file\u 2
。。。也就是说,如果需要
target_file
来完成目标,make将首先决定是否必须重建该文件:

  • 如果它不存在,make当然会尝试构建它
  • 如果它已经存在,make会将其上次修改时间与先决条件文件的修改时间进行比较。如果
    target_文件
    早于某个先决条件,make将尝试重新生成该文件
如果必须重新生成
target\u文件
,make将把每个配方行传递给shell(单独的shell),由shell执行生成(但是make无法检查这一点,编写合理的配方是您的责任)

请注意,所有这些都是递归的:如果缺少一个先决条件文件,make将搜索构建它的另一个规则。如果存在一个先决条件文件,但也存在一个作为目标的规则,make将在生成
target\u文件之前检查它是否是最新的。它将首先在顶级目标文件之前构建丢失或过时的先决条件文件

这有点像烹饪书中的食谱是指一种复合成分(比如酱汁),它在同一本烹饪书中有自己的单独食谱


与同样描述项目构建过程的朴素shell脚本的主要区别在于,shell脚本可能总是重建所有内容,而make只重建需要的内容。好处:大多数make实现也能够并行化:知道什么取决于make,也可以发现什么必须序列化,什么可以并行化。在多核计算机上,对于大型项目,加速因素可能非常重要。

回答得不错。我可能会添加一些关于依赖关系图和时间戳比较的内容,再加上一个make规则的典型示例。