gcc 是一个 C 编译器:它接受一个 C 源文件并创建机器代码,可以是未链接的目标文件的形式,也可以是实际的可执行程序,它已链接到所有目标模块和库。
make 对于控制项目的构建过程很有用。一个典型的 C 程序由几个模块 (.c) 和头文件 (.h) 组成。在更改任何内容后总是编译所有内容会很耗时,因此 make 旨在仅编译更改后需要重新编译的部分。
它通过遵循程序员创建的规则来做到这一点。例如:
foo.o: foo.c foo.h
cc -c foo.c
这条规则告诉 make 文件 foo.o 依赖于文件 foo.c 和 foo.h,如果它们中的任何一个发生变化,可以通过运行第二行的命令来构建它。 (上面不是实际的语法:make 想要由 TAB 字符缩进的命令,在这种编辑模式下我不能这样做。但想象一下它就在那里。)
make 从通常称为 Makefile 的文件中读取其规则。由于这些文件(传统上)是手工编写的,因此 make 有很多魔力可以让您缩短规则。例如,它知道 foo.o 可以从 foo.c 构建,并且它知道这样做的命令是什么。因此,上述规则可以简化为:
foo.o: foo.h
由三个模块组成的小程序可能有这样的 Makefile:
mycmd: main.o foo.o bar.o
$(CC) $(LDFLAGS) -o mycmd main.o foo.o bar.o
foo.o: foo.h bar.h
bar.o: bar.h
make 可以做的不仅仅是编译程序。一个典型的 Makefile 会有一个规则来清除不需要的文件:
clean:
rm -f *.o core myapp
另一个规则可能会运行测试:
check: myapp
./myapp < test.input > test.output
diff -u test.correct test.output
Makefile 可以“构建”文档:例如,运行一个工具将文档从某种标记语言转换为 HTML 和 PDF。
Makefile 可能有一个安装规则,用于将它构建的二进制程序复制到用户或系统管理员希望它安装的任何位置。
等等。由于 make 是通用且强大的,它通常用于自动化从解压缩源 tarball 到软件可供用户使用的整个过程。
如果你想全面了解make,还有很多东西要学。 GNU 版本的 make 有特别好的文档:http://www.gnu.org/software/make/manual/ 有各种形式。