在这本Linux手册中写道make是:
用于构建和维护程序组(以及其他程序)的实用程序 来自源代码的文件类型。
描述make实用程序的目的是确定 自动地需要重新编译大型程序的哪些部分, 并发出重新编译它们所需的命令。
automatic determination
在这里意味着什么?在我拥有构建脚本的地方运行make
或仅运行./build.sh
之间的主要/重要区别是什么?
答案 0 :(得分:1)
运行
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
和{{ 1}}。
依赖于源文件和目标文件(以及其他东西)之间的依赖关系被正确指定为make
。这是通过makefile实现的:
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
知道每当有什么变化时必须重建或更新的内容,它只会更新而不是从头开始构建所有内容。