【问题标题】:What is the principal difference between make command and running build .sh script?make 命令和运行 build .sh 脚本的主要区别是什么?
【发布时间】:2018-07-21 00:04:11
【问题描述】:

在这个 Linux 手册中写到 make 是:

用于构建和维护程序组(以及其他 文件类型)来自源代码。

说明 make 实用程序的目的是确定 自动需要重新编译大型程序的哪些部分, 并发出重新编译它们所需的命令。

automatic determination 在这里是什么意思?在我有构建脚本的地方运行 make 或仅运行 ./build.sh 之间的主要/显着区别是什么?

【问题讨论】:

  • 一个是基于 Makefioe 确定需要构建什么的工具,另一个是执行某人编写的任务的脚本,甚至可能使用 make
  • make 只重建依赖关系发生变化的文件。

标签: linux shell makefile build


【解决方案1】:

在我有构建脚本的地方运行 make 或仅运行 ./build.sh 之间的主要/显着区别是什么?

make 可以轻松使用,它只重建需要重建的部分(仅此而已)。


对比示例

考虑一个要构建的项目program,由以下文件组成:

main.c
foo.c
bar.c
foo.h
bar.h

对于本次讨论,我们假设 foo.cbar.c 分别仅包括(即:依赖)foo.hbar.c

  • 使用build.sh 脚本,该脚本仅包含用于构建软件的命令,如下所示:

    gcc -c foo.c
    gcc -c bar.c
    gcc -c main.c
    gcc foo.o bar.o main.o -o program
    

    如果只是修改了foo.h,则需要重新构建此项目。使用这种方法,这将通过重新运行 build.sh 来完成,这将编译 所有 源文件。请注意,bar.omain.o 实际上都不需要再次生成,因为文件 bar.cbar.hmain.c 没有改变,它们根本不依赖于 foo.h(即:它们不受foo.h 更改的影响)。

  • 然而,对于make,如果使用得当,会生成一个依赖图,这样只会再次生成需要更新的文件:在本例中为foo.cprogram

    这依赖于正确指定给make 的源文件和目标文件(除其他外)之间的依赖关系。这是通过 makefile 实现的:

    program: main.o foo.o bar.o
        gcc -o $@ $^
    
    foo.c: foo.h
    bar.c: bar.h
    

    基本上,它明确指定:

    • program 取决于 main.ofoo.obar.o
    • foo.c 依赖于 foo.h
    • bar.c 依赖于 bar.c

    隐含地:

    • main.o 取决于 main.c
    • foo.o 取决于 foo.c
    • bar.o 取决于 bar.c

    这样,make 知道在发生变化时必须重新构建或更新什么,并且它只更新这些内容,而不是从头开始构建所有内容。

【讨论】:

  • 感谢您的详细解答!如果一切都自动确定,makefile 的想法是什么?
  • 一些依赖关系可以通过某种方式自动确定(例如:.h 文件包含在.c 文件中),其他则必须手动提供。
  • 如果不出意外,Make 不知道在可能的依赖树森林中的哪个目标是您想要构建的目标。
  • @tripleee 谢谢。 Make 确实知道是哪个目标 (program),但不知道如何
  • make program 将在没有 Makefile 的情况下工作,如果所有依赖项都是微不足道的,但您也希望 make 做一些有用的事情。
猜你喜欢
  • 2012-07-27
  • 2011-01-28
  • 2011-01-18
  • 1970-01-01
  • 2016-11-28
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
相关资源
最近更新 更多