在这本Linux手册中写道:
用于构建和维护程序组(和其他 文件类型)来自源代码。
说明 make 实用程序的目的是确定 自动自动重新编译大型程序的哪些部分, 并发出重新编译它们所需的命令。
automatic determination
这里是什么意思?运行make
或仅在我拥有构建脚本./build.sh
运行之间的主要/显着区别是什么?
运行
make
或仅在我拥有构建脚本的地方运行./build.sh
之间的主要/显着区别是什么?
make
可以很容易地以这样一种方式使用,即它只重建需要重建的内容(仅此而已)。
比较示例
考虑要生成的项目,program
,由以下文件组成:
main.c
foo.c
bar.c
foo.h
bar.h
对于这个讨论,我们假设foo.c
和bar.c
分别只包括(即:依赖于)foo.h
和bar.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.o
实际上都不需要再次生成,因为文件bar.c
、bar.h
、main.c
没有改变,它们根本不依赖于foo.h
(即:它们不受foo.h
变化的影响)。但是,使用
make
,如果使用得当,则会生成依赖关系图,以便仅再次生成需要更新的文件:在这种情况下,foo.c
和program
。这依赖于源文件和目标文件(以及其他内容)之间的依赖关系被正确指定为
make
。这是通过生成文件实现的:program: main.o foo.o bar.o gcc -o $@ $^ foo.c: foo.h bar.c: bar.h
基本上,它明确指定:
program
取决于main.o
、foo.o
和bar.o
。foo.c
取决于foo.h
.bar.c
取决于bar.c
.
并隐含:
main.o
取决于main.c
foo.o
取决于foo.c
bar.o
取决于bar.c
这样,
make
知道每当某些事情发生变化时必须重建或更新什么,并且它只更新它,而不是从头开始构建所有内容。