文章的最后一句引起了我的注意
[F]或C/C++开发人员和有兴趣学习使用C/C++而不是Linux用户编程的学生.这是因为通过使用'make'命令在GNU/Linux中简化了源代码的编译.
我总是使用gcc来编译我的C/C++程序,而javac则用来编译我的Java程序.我只使用make通过configure/make/make install将程序安装到我的计算机上.
看来你可以使用命令make编译所有程序.
make和gcc有什么区别?
嗯... gcc是一个编译器,make是一个帮助构建程序的工具.差异很大.你永远不能纯粹使用make来构建一个程序; 它不是编译器.它是什么使它引入了一个单独的"规则"文件,它描述了如何从源代码转到完成的程序.然后它解释这个文件,找出需要编译的内容,然后为你调用gcc.这对于具有数百或数千个源代码文件的大型项目非常有用,并且可以跟踪编译器选项,包含路径等内容.
gcc编译和/或链接单个文件.它支持多种语言,但不知道如何将多个源文件组合成一个非平凡的运行程序 - 您通常需要至少两次gcc(编译和链接)调用来创建最简单的程序.
GCC上的维基百科页面将其描述为"编译系统":
GNU编译器集合(通常缩写为GCC)是由GNU项目生成的编译器系统,支持各种编程语言.
make是一个"构建工具",它以特定的顺序调用编译器(可能是gcc)来编译多个源并将它们链接在一起.它还跟踪源自编译源的各种源文件和目标文件之间的依赖关系,并且仅对自上次构建以来已更改的组件执行操作.
GNUmake是make的一个流行实现.GNUmake的描述如下:
Make是一个工具,用于控制程序源文件中程序的可执行文件和其他非源文件的生成.
Make了解如何从名为makefile的文件构建程序,该文件列出了每个非源文件以及如何从其他文件计算它.
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.c构建foo.o,并且它知道执行此命令的是什么.因此,上述规则可以缩短为:
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是通用且功能强大的,因此它通常用于自动化整个过程,从解压缩源tar包到软件已准备好供用户使用.
如果你想要完全学习,有很多东西需要学习.GNU版本的make具有特别好的文档:http://www.gnu.org/software/make/manual/以各种形式提供它.
Make经常使用 gcc编译大量的C或C++文件.