make命令和正在运行的build .sh脚本之间的主要区别是什么?

时间:2018-02-10 09:00:27

标签: linux shell makefile build

在这本Linux手册中写道make是:

  

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

     

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

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

1 个答案:

答案 0 :(得分: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.o编译所有源文件。请注意,实际上不需要再次生成main.obar.c,因为文件bar.hmain.cfoo.h没有发生变化,他们根本不依赖foo.h(即:他们不受make变更的影响。

  • 但是,如果使用foo.c,则会生成依赖关系图,以便仅再次生成需要更新的文件:在这种情况下program和{{ 1}}。

    依赖于源文件和目标文件(以及其他东西)之间的依赖关系被正确指定为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知道每当有什么变化时必须重建或更新的内容,它只会更新而不是从头开始构建所有内容。