c89 [-c] [-D name[=value]]... [-E] [-g] [-I directory ]... [-L directory]... [-o outfile] [-O] [-s] [-U name]... operand...
此发行版的 c89 实用程序符合《CAE Specification, Commands and Utilites, Issue 5》(日期:1997 年 2 月)。
c89 实用程序是标准 C 编译系统的接口;接受符合 ISO C 标准的源代码。从概念上讲,此系统由一个编译器和一个链接编辑器组成。operand 引用的文件将进行编译和链接,以生成可执行文件。
如果指定了 -c 选项,对于格式为 file.c 的所有路径名操作数,文件:
$(basename pathname .c).o
将在成功编译后创建。
如果没有选项阻止链接编辑(例如 -c 或 -E),并且所有操作数编译和链接都没有错误,将根据 -o outfile 选项(如果有)或根据文件 a.out 写入生成的可执行文件。
所创建可执行文件的文件权限设置为
S_IRWXO | S_IRWXG | S_IRWXU
并清除进程的 umask 指定的位。
以下几项影响 c89 实用程序的选项:
-l library 操作数采用选项的格式,但是其在操作数列表中的位置影响搜索库的顺序。
指定 -I 和 -L 选项的顺序非常重要。
可移植应用程序必须单独指定每个选项;即,分组选项字母(例如 -cO)无需由所有实现识别。
支持以下选项:
禁止编译的链接编辑阶段,并且不删除生成的任何对象文件。
在对象文件或可执行文件中生成符号信息。
生成对象文件或可执行文件或者同时生成两者,已从中删除(剥离)使用 exec 系列正确执行所不需要的符号和其他信息。如果 -g 和 -s 选项都存在,-s 将覆盖 -g。
对于生成的可执行文件,使用路径名 outfile 而非缺省值 a.out。此选项无法与 -c 或 -E 一起使用。
定义 name,如同通过 C 语言 #define 指令进行定义。如果未指定 =value,将使用值 1。-D 选项的优先级低于 -U 选项;即,如果 name 既用于 -U 选项,又用于 -D 选项,则无论这两个选项顺序如何,name 均未定义。c89 支持至少 2048 个字节的 -D 定义和 256 个字节的 name。
以下预定义的 name 在所有模式下均有效:
__sparc (SPARC) __i386 (x86) __unix __sun __BUILTIN_VA_ARG_INCR __SUNPRO_C=0x500 __SVR4
以下 name 在 -Xc 模式下未预定义:
unix sparc (SPARC) i386 (x86) sun
将 C 语言源文件复制到标准输出,从而扩展所有预处理程序指令;不执行任何编译。如果任何操作数不是文本文件,将会出现错误。
将名称不是绝对路径名的头文件的搜索算法更改为在常规位置中查找之前先在 directory 路径名指定的目录中查找。因此,对于名称括在双引号 ("") 中的头文件,将先在带有 #include 行的文件的目录中搜索,然后在 -I 选项中指定的目录中搜索,最后在常规位置搜索。对于名称括在尖括号 (<>) 中的头文件,将仅在 -I 选项中指定的目录中搜索,然后在常规位置搜索。将以指定的顺序搜索在 -I 选项中指定的目录。
将在 -l 对象中指定的库的搜索算法更改为在常规位置中查找之前先在 directory 路径名指定的目录中查找。将以指定的顺序搜索在 -L 选项中指定的目录。
优化。
删除 name 的任何初始定义。
可指定 -D、-I、-U 和 -L 选项的多个实例。
operand 采用路径名的格式或 -l library 的格式。必须至少指定一个路径名格式的操作数。支持以下操作数:
要编译和链接(后者可选)的 C 语言源文件。如果使用 -c 选项,则此操作数必须采用这种格式。
通常由 ar(1) 实用程序生成并直接传递给链接编辑器的对象文件库。
由 c89 -c 生成并直接传递给链接编辑器的对象文件。
(字母 ell。)搜索名为 liblibrary.a 的库。
遇到库名称时将搜索库,所以 -l 操作数的位置非常重要。能以这种形式指定多个标准库。请参见下文附注中的标准库。
由于 c89 实用程序通常在编译过程中在当前目录中创建文件,因此一般有必要在可创建文件的目录中运行 c89 实用程序。
当未指定 -c 且指定了多个源文件时,c89 会创建 .o 文件。
某些历史实现已允许在命令行中 -L 选项夹杂着 -l 操作数。要使应用程序在不表现这种行为的系统上进行一致地编译,可移植应用程序有必要在任何 -l 选项之前提供所有 -L 选项。
在可能的情况下,如果用户提供多个版本的标准库函数(在隐式 -l c 或显式 -l m 遇到它们之前),将使用这些版本代替标准版本。也可能并非如此,原因有多种(函数定义为宏、清除名称空间的操作等),所以将显式声明与 -L 目录中的标准库命名方式相同的文件的存在,以生成未指定的行为。
设置环境变量 TMPDIR 会覆盖缺省临时目录。
如果指定了多个以 .c 结尾的文件操作数,则对于每个此类文件:
"%s:\n", <file>
可能写入。这些消息(如果写入)将在每个输入文件的处理之前;如果将这些消息写入标准错误(如 STDERR 中所述),则不会将其写入标准输出。
如果指定了 -E 选项,标准输出将是表示语言预处理阶段结果的文本文件;可能包含适用于后续编译传递的额外信息。
仅用于诊断消息。如果指定了多个以 .c 结尾(也可能是其他未指定的后缀)的文件操作数,则对于每个此类文件:
"%s:\n", <file>
可能写入,以允许以相应的输入文件标识诊断和警告消息。这些消息(如果写入)将在每个输入文件的处理之前;如果将这些消息写入标准输出(如 STDOUT 中所述),则不会将其写入标准错误。
有关影响 c89 执行的以下环境变量的描述,请参见 environ (5) :LANG、LC_ALL、LC_TYPE、LC_MESSAGES 和 NLSPATH。
提供将覆盖临时文件缺省目录(如果有)的路径名。
返回以下退出值:
编译或链接编辑成功。
出错。
当 c89 遇到导致不创建对象文件的编译错误时,会将诊断消息写入标准错误,并继续编译其他源代码操作数,但是不会执行链接阶段,并将返回非零退出状态。如果链接编辑不成功,会将诊断消息写入标准错误,c89 将以非零状态退出。可移植应用程序必须依赖 c89 的退出状态,而不是依赖可执行文件的存在或模式。
以下是用法示例:
编译 foo.c 并创建可执行文件 foo。
编译 foo.c 并创建对象文件 foo.o。
编译 foo.c 并创建可执行文件 a.out。
编译 foo.c,将其与 bar.o 链接,并创建可执行文件 a.out。也创建并保留 foo.o。
以下示例说明了 -L 选项和 -l 操作数的用法和交互:考虑这样一种情况,模块 a.c 调用库 libQ.a 中的函数 f,模块 b.c 调用库 libp.a 中的函数 g。假定这两个库都在 /a/b/c 中。以所需方式编译和链接的命令行是:
c89 -L /a/b/c main.o a.c -l Q b.c -l p
在这种情况下,-l Q 操作数只需在第一个 -l p 操作数前面,因为 libQ.a 和 libp.a 在同一个目录中。当发生库名称冲突时,可使用多个 -L 操作数。在上个示例的基础上,假设用户希望使用新的 libp.a(在 /a/a/a 中),但是仍需要 /a/b/c/libQ.a 中的 f:
c89 -L /a/a/a -L /a/b/c main.o a.c -l Q b.c -l p
在本例中,链接程序将以指定顺序搜索 -L 选项,在解析 b.c 的引用时,会在 /a/b/c/libp.a 之前查找 /a/a/a/libp.a。但是,-l 操作数的顺序仍然非常重要。
ar(1)、cc(1B)、nm(1)、strip(1)、umask(1)、environ(5)
c89 实用程序可识别标准库的以下 -l 操作数:
此库包含所有库函数,但列为驻留在 <math.h> 中的那些函数除外。无需提供此操作数即可搜索此库。
此库包含 math.h 中引用的所有函数。实现可能会在没有此操作数的情况下搜索此库。
此库包含无法通过 -l c 操作数使用的 lex 的 C 语言输出所需的所有函数。
此操作数使 <pthread.h> 中引用的所有函数和 <unistd.h> 中引用的 pthread_atfork() 可见。实现可能会在没有此操作数的情况下搜索此库。
此操作数使 <aio.h>、<mqueue.h>、<sched.h> 和 <time.h> 中引用的所有函数可见。实现可能会在没有此操作数的情况下搜索此库。
此库包含无法通过 -l c 操作数使用的 yacc 的 C 语言输出所需的所有函数。
如果没有阻止链接编辑器调用的选项(例如 -c 或 -E),c89 实用程序会使 -l c 操作数的等效对象作为最后一个 -l 操作数传递给链接编辑器,导致在装入其他所有对象文件和库之后搜索此操作数。
C 编译器和链接编辑器支持外部符号有效值的长度高达至少 31 个字节。
编译器和链接编辑器支持每个源文件或对象文件最少 511 个外部符号,总共最少 4095 个外部符号。如果超出限制,会将诊断消息写入标准输出。