我们知道在Unix操作系统中,实现C源程序到可执行文件的这一转换过程的工具是cc。在大多数系统中cc实际上是一个shell命令文件。有些Unix操作系统中的C编译程序可能并不叫cc而是其它的一个什么名称,如Sun工作站上常用的gcc等等。但这些都无关紧要。
大多数Unix操作系统中C编译命令的用法基本上都是类似的。我们这里介绍的将以SVR4上的C编译系统为基础。
在某个程序的源代码被存放到多个不同文件中的情况下,我们只需要在命令行中一一指定这多个C文件即可。例如,我们可以将上述myprog.c拆分为两个C文件和一个头文件
(.h)如下:
- myprog.h
- # include <stdio.h>;
- # inclued <ctype.h>;
- # define TESTOK 1
- myprog.c
- #include "myprog.h"
- void main (int argc,char * argv[])
- {int i;
- for (i=1;i<argc;i + +)
- if (TestInput(argv)= = TESTOL)
- printf("The %dth value '%s' \tis ok! \n",argv[1]);
- else
- printf("The %dth value ' %s' \tis BAD! \n",iargv);
- }
- myfunc.c
- #include "myprog.h"
- int TestInput(char * ValueInput)
- {while (* ValueInput)
- if (!isdigit(*ValueInput) return (! TESTOK);
- else ValueInput + +
- return ((100/atoi(ValueInput))? TESTOK:! TESTOK);
这时要再编译此程序时可输入如下命令:$ cc -o myprog myprog.c myfunc.c
在这个命令行中如果不指定myfunc.c,此时由于在myprog.c中所调用的TestInput()这个函数不是任何标准的库函数,在链接时链接程序将找不到此符号的定义,故链接过程将以失败而告终,此时cc将给出如下的错误信息:
- Undefine first referenced
- symbol in file
- TestInput myprog.o
- id: myprog:fatal error: Symbol referencing errors.No output written to myprog $
而可执行文件myprog也无法生成。但编译却会生成myprog.c的目标代码(在某个文件固有语法错误而无法正确被编译的情况下(此时为编译过程出错),cc将生成其他无语法错误的源文件的目标文件,但不进行链接)。如下:
- $ ls -ltotal 8
- rw-r--r-- 1 yxz user 454 Sep 1 09:27 myfunc.c
- rw-r--r-- 1 yxz user 479 Sep 1 09:28 myprog.c
- rw-r--r-- 1 yxz user 298 Sep 1 09:27 myprog.h
- rw-r--r-- 1 yxz user 924 Sep 1 09:28 myfunc.o
此时我们可以使用如下命令行得到可执行文件:$ cc -o myprog myprog.o myfunc.c
这里我们看到,cc命令行中的文件参数可以不全是.c文件,目标文件(.o)文件以后编译过程中所得到的其他文件,如预编译后文件(.i文件),编译后的汇编程序(.s文件)等都可作为文件参数。在了解了Unix操作系统 C编译系统的工作过程之后,理解这一点是不困难的。因为编译系统只需要对各种不同类型的文件进行有关的处理就可以了。
关于cc命令最基本的用法我们就介绍这么多,其它更高级的用法可参考以后关于Unix操作系统知识的讨论。
【编辑推荐】