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



在这本Linux手册中写道:

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

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

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

运行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。这是通过生成文件实现的:

    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知道每当某些事情发生变化时必须重建或更新什么,并且它只更新它,而不是从头开始构建所有内容。

相关内容

最新更新