make和gcc有什么区别?

时间:2009-04-20 14:00:00

标签: gcc makefile compiler-construction

article中的最后一句话引起了我的注意

  

[F]或C / C ++开发人员和   有兴趣学习的学生   程序用C / C ++而不是用户   Linux操作系统。这是因为编译   源代码简单易懂   GNU / Linux使用'make'   命令。

我一直使用gcc来编译我的C / C ++程序,而javac则用来编译我的Java程序。我只使用make通过configure / make / make install将程序安装到我的计算机上。

您似乎可以使用命令make编译所有程序。

make和gcc有什么区别?

11 个答案:

答案 0 :(得分:58)

嗯...... gcc是一个编译器,make是一个帮助构建程序的工具。差异很大。你永远不能纯粹使用make来构建一个程序;它不是编译器。它是什么使它引入了一个单独的“规则”文件,它描述了如何从源代码转到完成的程序。然后它解释这个文件,找出需要编译的内容,然后为你调用gcc。这对于包含数百或数千个源代码文件的大型项目非常有用,并且可以跟踪编译器选项,包含路径等内容。

答案 1 :(得分:13)

gcc 编译和/或链接单个文件。它支持多种语言,但不知道如何将多个源文件组合成一个非平凡的运行程序 - 您通常需要至少两次gcc(编译和链接)调用来创建最简单的程序。

GCC上的维基百科页面将其描述为“编译系统”:

  

GNU编译器集合(通常缩写为GCC)是由GNU项目支持各种编程语言生成的编译器系统。

make 是一个“构建工具”,它以特定的顺序调用编译器(可能是gcc)来编译多个源并将它们链接在一起。它还跟踪源自编译源的各种源文件和目标文件之间的依赖关系,并且仅对自上次构建以来已更改的组件执行操作。

GNUmake是make的一个流行实现。 GNUmake的描述如下:

  

Make是一个工具,可以从程序的源文件中控制程序的可执行文件和其他非源文件的生成。

     

Make了解如何从名为makefile的文件构建程序,该文件列出了每个非源文件以及如何从其他文件计算它。

答案 2 :(得分:11)

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/以各种形式提供它。

答案 3 :(得分:5)

Make经常使用 gcc来编译大量的C或C ++文件。

答案 4 :(得分:4)

Make是一个工具,用于构建任何复杂系统,在这些系统中,各种系统组件之间存在依赖关系,通过尽可能少的工作量来完成。

如果您想了解可以使用的所有内容,GNU make manual非常出色。

答案 5 :(得分:4)

make在当前目录中使用Makefile将一组规则应用于其输入参数。 Make也知道一些默认规则,即使它在当前目录中找不到Makefile(或类似的)文件也会执行。执行cpp文件的规则恰好在许多系统上调用gcc

请注意,您不是使用输入文件名调用make,而是使用规则名称调用输出 。因此,调用make xyz将努力执行规则xyz,默认情况下会生成文件xyz(例如,基于源代码文件xyz.cpp

答案 6 :(得分:4)

make本质上是构建代码的专家系统。您可以为事物的构建方式以及它们所依赖的内容设置规则。然后,Make可以查看所有文件的时间戳,并确定需要随时重建的内容。

gcc是“gnu编译器集合”。它支持许多语言(C,C ++,Ada等,具体取决于您的设置),但它仍然是许多可用于构建系统的工具。

答案 7 :(得分:3)

您可以使用make来编译C和C ++程序,方法是在makefile中调用gcc或g ++来执行所有编译和链接步骤,允许您使用一个简单的命令执行所有这些步骤。它不是编译器的替代品。

答案 8 :(得分:3)

gcc是一个像javac这样的编译器。你给它源文件,它给你一个程序。

make是一个构建工具。它需要一个文件来描述如何根据文件之间的依赖关系在项目中构建文件,因此当您更改一个源文件时,您不必重建所有内容(如果您使用了构建脚本)。 make通常使用gcc来实际编译源文件。

答案 9 :(得分:2)

'gcc'是编译器 - 实际上将源代码转换为可执行文件的程序。您必须告诉它源代码的位置,输出内容以及库和选项等各种其他内容。

'make'更像是用于编译程序的脚本语言。这是一种隐藏编译源代码的所有细节的方法(所有那些你必须通过编译器的参数)。您可以在Makefile中编写一次上述所有详细信息,因此您不必每次都为每个文件键入它。它还会做很好的事情,比如只重新编译已更新的源文件,并处理依赖性(如果我重新编译这个文件,我将需要重新编译该文件。)

答案 10 :(得分:1)

最大的区别是make是图灵完成(Are makefiles Turing complete?)而gcc不是。