在linux终端中编译C代码时,make <filename>和cc <filename>有什么区别?

时间:2016-08-11 16:02:49

标签: c

我是C的新手,我明白这两个命令都完成了同样的事情,但是其中一个命令做了哪些不同的事情呢?

3 个答案:

答案 0 :(得分:2)

首先,如果您使用的是make,那么对于hello.c,您将调用make作为make hello而不是make hello.c。另请注意,makeMakefile一起使用的大部分时间都是make。尽管如此,您可以使用hello从单个源文件构建可执行二进制文件,如图所示。

如果可执行文件(make)不存在,则两者都具有相同的效果 - 从源文件创建可执行文件。

但是,如果可执行文件已经存在,那么cc只有在认为源代码在上次构建后发生了更改时才会运行构建命令,而$ make hello cc hello.c -o hello $ make hello make: 'hello' is up to date. # make does not think source file has changed $ touch hello.c # Update the timestamp of hello.c $ make hello cc hello.c -o hello # make thinks source file changed. Builds again $ 将始终执行构建。

例如:

cc

但是,$ cc hello.c -o hello $ ls -l hello | cut -d ' ' -f '8-' 12:18 hello $ cc hello.c -o hello # Build again without changing source $ ls -l hello | cut -d ' ' -f '8-' 12:21 hello # hello was built again $ 不会检查来源是否已更改。它将始终执行所需的构建。

GNU make

以上说明适用于GNU ccmake。不确定其他实现。

P.S。cc不是编译器。它只在它认为应该编译时调用编译器,如上例所示。而cc hello.c是编译器。

P.S。如果您运行a.out,则首选项名称为hello,而不是 SELECT *, SUM(CASE WHEN Typ = 1 THEN 1 ELSE 0 END) AS MailsSum, SUM(CASE WHEN Typ = 3 THEN 1 ELSE 0 END) AS CallsSum FROM customer INNER JOIN records on records.KD_ID = customer.KD_ID GROUP BY KD_ID HAVING MailsSum = 0

答案 1 :(得分:1)

make(1)是一个运行命令的程序。您创建一个名为&#34; Makefile&#34;的文件。在目录中。 Makefile具有特定语法的配方,超出了本答案的范围。然后,使用名为make

的文件在目录中调用Makefile命令

cc $filename将在$filename

上调用C编译器

答案 2 :(得分:0)

ccgccclang将调用编译器。

如果要编译许多文件,则使用

make。 在make中,您将提供.o文件的名称并包含头文件位置。