cc
cc命令运行系统的C 编译器。
查看英文版
1 cc 运行系统环境
2 cc 描述
3 cc 语法
4 cc 选项
5 cc 环境变量
6 cc 示例
cc 运行系统环境
Unix&Linux
cc 描述
编译器的基本职责是将计算机程序从一种语言翻译成另一种语言,并且通常在一次编译中执行一次以上。
编译用C编写的程序时,编译器将通过几个步骤将其转换为可在目标体系结构或平台上执行的机器代码。
通常,编译器对您的代码执行以下功能:
- 预处理。C预处理器(“ cpp”)通过删除注释,扩展宏并执行其他一些重要步骤来准备将要发送到实际编译器的代码。
- 语法检查。您的程序是否包含任何语法错误?如果是这样,编译器会告知您,并且您必须先修复它们,然后再继续。如果怀疑程序的某些部分不正确,但是不确定它们是否确实是错误的,则它可能会发出警告,但仍会编译程序。
- 转换为汇编语言。这是一个中间步骤,其中您的代码被翻译为目标系统的汇编语言。这几乎是人类仍然可以阅读您的代码的最后一步。
- 部件。您的程序被组装为适合您目标平台的目标代码的位和字节。
- 连结中。目标代码与程序和命令行选项指定的任何库函数的目标代码链接在一起,并创建了一个可执行文件。
查看英文版
cc 语法
cc [ options ]
查看英文版
cc 选项
实际上,您可以将数百个选项传递给编译器,以微调程序的执行方式。
在这里,我们选择了一些最有用且最常用的选项,您可能会需要这些选项来创建可执行文件。
-C |
只需编译代码即可;不要尝试链接源文件。 将创建目标文件,可以选择稍后在一个单独的步骤中链接目标文件以创建可执行文件。 |
-O [level] |
创建优化的可执行文件。 编译器将分析您的代码,如果知道任何巧妙的技巧可以提高性能,它将在字节码中实现它们。 该水平是一个可选的数字,字母或文字可以指定多少的优化应该做的。 例如,GNU编译器集合允许选项-O0指定最小优化(默认值), - O1和-O2指定中间优化级别,而-O3指定最大优化。 -Ofast可以用作-O3的别名,并且-Og将执行与调试器以后的分析兼容的优化。 优化需要更多的计算和内存,并且需要更长的时间才能完成。 x86系统的常见优化技巧包括减小指令大小以减少执行的计算量; 为值零实现专用寄存器(因为在大多数程序中通常使用零), 以及利用某些优势来优化某些乘法和数组索引缩放操作所述的LEA(“加载有效地址”)指令。 |
-Wall |
编译时启用“所有”(除了最深奥的)警告。 这是经常使用的好选择,因为它可以提示您可能不是错误的任何情况, 但是您可能希望在编译之前解决这些情况。 |
-ansi |
禁用cc提供的大多数(但不是全部)非ANSI C兼容功能。 要遵守严格的ANSI标准,请启用此选项。 这样做将确保您的代码具有完全可移植性,可以在任何其他系统上进行编译。 |
-G |
创建已编译的可执行文件的调试版本。 编译器将在编译的可执行文件中包含有关哪个源文件的哪一行对应于哪个函数调用的信息。 当您逐步执行程序时,调试器以后可以使用此信息来显示源代码。 请注意,这将创建一个更大的可执行文件。 |
-D -ansi |
通过将指定的值分配给符号名称来定义编译时的宏。 运行C预处理程序时,它将把name的任何实例扩展为value的文本。 |
-Idir |
搜索目录所包含的文件,其名称以斜线(不要开始/)之前搜索照常目录。 按照指定的顺序搜索多个-I选项的目录。 预处理程序首先在包含源文件的目录中搜索#include文件,然后在以-I选项命名的目录(如果有)中搜索/ usr / ucbinclude,然后在/ usr / include中搜索。 |
-Ldir |
将dir添加到编译器将在其中查找链接库的目录列表。 此选项传递给ld和/ usr / lib。 |
-llibrary |
如果链接,则此选项将指示的库添加到要链接的库列表中。
例如,如果您使用的是C数学库(libm)中的函数,则可以在编译时使用-lm选项将其链接。 首先指定其他库将依赖的任何库。 例如,“ -lGL -lGLU ”将首先搜索libGL,然后搜索libGLU。 libGLU依赖于libGL,因此,如果您颠倒了这些-l选项的顺序,该程序将无法编译。 |
-M |
如果链接,请创建一个与输出可执行文件具有相同基本名称的映射文件,但后缀为.map。 该映射文件包含符号列表及其地址。 |
-mmodel |
指定编译器和链接器使用的内存模型。 model的值包括s代表“小”存储模型,m代表“中”,l代表“大”,f代表“ flat”(32位),c代表“ compact”,h代表“ huge”。 除非您确定需要此选项,否则可以忽略它。 |
-o file name |
编译后的可执行文件的输出名称。 如果未指定文件名,则编译后的可执行文件将被命名为a.out。 |
-S |
产生汇编程序源代码,但在实际汇编之前停止。 |
-Uname |
“取消定义”任何先前定义的名为name的宏,无论是在源代码中还是在命令行中使用-D指定。 |
查看英文版
cc 环境变量
以下环境变量会影响编译过程:
LANG |
这些环境变量控制编译器使用本地化信息与不同的国家惯例一起工作的方式。 对于以UTF-8 编码的英语,通用值为“ en_GB.UTF-8 ” 。 如果设置,LC_ALL变量将覆盖所有其他语言环境设置。 要查看您当前的语言环境设置,请使用locale命令。 |
TMPDIR |
如果设置了TMPDIR,它将指定用于临时文件的目录。 编译器使用临时文件保存一个编译阶段的输出,该输出将用作下一阶段的输入。 例如,预处理程序的输出(即实际编译器的输入)在编译过程中存储在临时文件中。 |
COMPILER_PATH |
用冒号分隔的目录列表,非常类似于PATH变量。 如果编译器使用GCC_EXEC_PREFIX的值找不到子程序,则会在此目录列表中搜索子程序。 |
LIBRARY_PATH |
用冒号分隔的目录列表,类似于PATH。 链接时,编译器将在此目录列表中搜索链接的库,并使用GCC_EXEC_PREFIX的值找不到特殊的链接器文件。 |
CPATH |
这些变量中的每一个都可能包含由特殊字符分隔的目录列表,就像PATH一样,编译器将在其中查找头文件。 特殊字符PATH_SEPARATOR取决于目标,并在构建时确定。对于大多数Linux目标,PATH_SEPARATOR是冒号。 CPATH指定要搜索仿佛用指定的目录列表-I选项,但给定任何路径后-I选项。 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH和OBJC_INCLUDE_PATH仅在预处理指定的特定语言时适用。 每个命令都指定要搜索的目录列表,就像使用-isystem指定的一样,但是在命令行上使用-isystem选项指定的任何路径之后。 在所有这些变量中,一个空元素指示编译器搜索其当前工作目录。 空元素可以出现在路径的开头或结尾。例如,如果CPATH的值为:/ special / include,则其效果与“ -I。-I / special / include ”相同。 |
DEPENDENCIES_OUTPUT |
如果设置了此变量,则其值指定如何基于编译器处理的非系统头文件输出make的依赖项。 系统头文件在依赖项输出中被忽略。 DEPENDENCIES_OUTPUT的值可以只是一个文件名,在这种情况下,将Make规则写入该文件, 并从源文件名中猜测目标名称。 或者该值可以采用“ file target ” 的形式,在这种情况下,使用target作为目标名称将规则写入文件file。 |
查看英文版
cc 示例
cc myfile.c
编译文件myfile.c。输出将被写入可执行文件a.out。
cc myfile.c -o myexe
编译文件myfile.c并将其命名为已编译的可执行输出文件myexe。
cc myfile.c -Wall -o myexe
编译文件myfile.c并将已编译的可执行文件输出为myexe,如果发生则在编译期间显示警告。
cc myfile.c -Wall -lX11 -o myexe
编译myfile.c文件的可执行myexe,连接的libx11库和编译过程中发出任何警告适用。
cc myfile.c -Wall -ansi -lX11 -o myexe
编译myfile.c文件的可执行myexe,连接的libx11库,严格遵守ANSI C标准,如果适用发出警告。
查看英文版