% cc foobar.c
就会把 foobar.c 通过以上的步骤编译出来。如果你有 多个文件要编译,只要输入
% cc foo.c bar.c
注意,语法检查就是──纯粹的检查语法。而不会检测你可能犯的任何逻辑 错误。比如无限循环,或者是你想用一元排序却使用了冒泡排序。
cc 有很多选项,在帮助手册中都可以找到。这里列出了一 些最重要的选项,并且有例子。
-
输出的文件名。如果你不使用这个选项,cc为产生 出一个叫 a.out 的执行文件。
% cc foobar.c
可执行文件是 a.out
% cc -o foobar foobar.c 可执行文件是 foobar
-
仅仅编译文件,不会连接。如果你只想检查你写的测试程序的语法的话, 这个选项非常有用。或者你会使用 Makefile。
% cc -c foobar.c
这会产生一个 目标文件 (不可执行) 叫做 foobar.o。这个文件可以和其他的目标文件连接在一起 构成一个可执行文件。
-
产生一个可调试的可执行文件。编译器会在可执行文件中植入一些信息, 这些信息能够把源文件中的行数和被调用的函数联系起来。在你一步一步调试程 序的时候,调试器能够使用这些信息来显示源代码。这是 非常 有用的;缺点就是被植入的信息让程序变得更大。通常情况下,开 发一个程序的时候我们经常使用
-g
,但是我们在编译一个 “release 版本” 的程序的时候,如果程序工作得让人满意了,我 们就不使用-g
编译。% cc -g foobar.c
-
产生一个优化版本的可执行文件。编译器会使用一些聪明的技巧产生出比 普通编译产生的文件执行更快的可执行文件。可以在
-O
加 上数字来使用更高级的优化。但是这样做经常会暴露出编译器的优化器中的一些 错误。例如,2.1.0 版本的 FreeBSD 中的 cc 在某些情况 下使用了-O2
的话,会产生出错误的代码。优化通常只在编译一个 release 版本的时候才被打开。
% cc -O -o foobar foobar.c
这会产生一个优化版本的 foobar。
-o filename
-c
-g
-O
下面的三个参数会迫使 cc 检查你的代码是否符合一些国 际标准,经常被我们叫做 ANSI 标准,虽然严格的来说它是一个 ISO 标准。
-
打开所有 cc 的作者认为值得注意的警告。不要只 看这个选项的名字,它并没有打开所有 cc 能够注意到的 所有警告。
-
关闭大多数,但并不是所有,cc 提供的非 ANSI C 特性。不要只看选项的名字,它并不严格保 证你的代码会兼容标准。
-
关闭 所有 cc 的非 ANSI C 特性。
-Wall
-ansi
-pedantic
没有这些选项,cc 能允许你按照标准使用一些非标准的扩 展。有一些扩展非常有用,但不能与其他编译器兼容──实际上,这个标准的主要 目的之一就是允许我们写出可以在任何系统上的由任何编译器编译的代码。这就叫做 可移植代码
通常来说,你应该让你的代码尽可能的可以移植。否则你就不得不完全重写你的 代码以便能够在其他地方运行之──而且谁知道几年后你是否还会用它?
% cc -Wall -ansi -pedantic -o foobar foobar.c
这会在检查 foobar.c对标准的兼容性以后产生一个 foobar 可执行文件。
-
在连接的时候指定一个函数库。
最常见的情况就是当你编译一个使用了一些 C 中的数学函数的时候。不 像大多数其他的平台,这些函数都不在 C 的标准库里面。你必须告诉编译器加 上这些库。
这个规则就是,如果库的名字叫做 libsomething.a,你就必 须给 cc 这样的选项
-lsomething
。例如,数学库 叫做 libm.a,因此你给 cc 的选 项就是-lm
。一般情况下,我们要把这个选项放到命令行的 最后。% cc -o foobar foobar.c -lm
这个会把数学函数库连接到 foobar 里面。
-llibrary