gcc [options] file-list [-larg]
g++ [options] file-list [-larg]
Linux和Mac OS X 操作系统实用GUN C编译器gcc来预处理,编译,汇编和连接C语言源文件.具有不同前端的相同编译器g++也能处理c++源代码.gcc和g++编译器可以汇编和连接汇编语言源文件,也可以只连接目标文件或者以共享库的形式生成目标文件.
这些编译器从命令行上制定的文件获得输入.除非使用-o选项,否则编译器将得到的可执行程序存储在a.out中.
编译器gcc和g++都是GCC(GNU Compiler Collection)的一部分.GCC包括了C,C++,Objective C,Fortran,Java和Ada语言的前端和库.登陆gcc.gnu.org可获得更多信息.
本节主要针对gcc编译器介绍,但大多数情况下它也适用于g++.
不带任何选项的gcc可以接收c语言源文件,汇编语言源文件,对象文件.适用程序gcc预处理,编译,汇编,连接这些文件,并生成名为a.out的可执行文件.如果gcc用来创建对象文件而不连接它们以生成可执行文件,每个对象文件名源文件的基称上加上扩展名.o组成.如果用gcc来创建可执行文件,那么,它就在连接文件后删除这些对象文件.
下面列出了一些最常见的选项.当某文件扩展名与某个选项关联时,用户可以家丁gcc把扩展名时添加到源文件的基称之后的.
-c | (compile) 不进行编译过程的连接步骤.编译和/或汇编源代码文件,保留扩展名.o的对象代码. |
-Dname(=value) | 通常#define预处理指令放在头文件或者include文件中.可以在命令中实用这个选项定义一些符号名.例如,-DLinux与在include文件的 #include Linux行等价;-DMACH=i586与#define DMACH i586 等价. |
-E | (everything) 对于源文件,值允许编译过程中的预处理,禁止所有其他步骤,将结果写到标准输出.阿斯顿约定,C语言源文件预处理后的文件扩展名为.i;C++语言源文件预处理后的文件扩展名为.ii. |
-fpic | 使gcc生成与位置无关(position-independent)的源代码,这样的代码适于安装到共享库. |
-writable-strings | 默认情况下,GNU C编译器将字符串常量放置在受保护的内区(protected memory)中,使得它们不会被修改.一些程序(通常时版本较老的程序)假设用户可以修改字符串常量.该选项改变了gcc的行为,因此可以修改字符串常量. |
-g | (gdb)在对象文件中嵌入诊断信息.该信息由符号调试器(如 gdb)使用.虽然后面使用调试器才用到,但包含该选项是一种好习惯. |
-Idirectory | 搜索标准位置之前,先在directory中查找include文件.多次给出该选项可以在多个目录下查找. |
-larg | (首字母时小写字母l) 在/lib和/usr/lib目录中搜索名为linarg.a的库文件.如果找到该文件,gcc就直接在库内搜索需要的函数库.可将arg替换为搜索的库文件名.例如,选项-lm通常链接到标准数学库libm.a.该选项的位置很重要,通常它被放在命令行的末尾,可以多次使用该选项来搜索不同库.库按照它们在命令行上的顺序依次搜索.连接器使用库来解决命令行,库选项之前模块中未定义的符号.可使用-L选项添加其他的库路径来搜索libarg.a. |
-Ldirectory | 为了搜索用-l选项给出的库,向要搜索的目录列表中添加directory.在搜索库的标准位置之前搜索实用-L添加到列表中的目录. |
-o file | (output) 对连接file得到的可执行文件进行命名,而不采用默认的a.out. |
-On | (optimize) 尽量优化编译器产生的目标代码.n的值可以是0,1,2,或者3(如果为linux内核编译代码,n就可以是06),默认值为1.较大的n值具有较好的优化结果,但会增加目标代码量和gcc运行时间.实用-O0可以关闭优化功能.当使用gcc的-O选项时,很多相关的选项可以精确地控制优化类.参见gcc的info页以获得详细信息. |
-pedantic | GNU C编译器接收的C语言包含一些标准ANSI C语言没有特性.使用该选项强制gcc放弃C语言的扩展,接收标准C语言的特性. |
-Q | 显示gcc编译的函数名和每次编译的统计信息. |
-S | (suppress) 禁止编译过程中对源代码文件的汇编连接步骤.得到的汇编语言文件的扩展名为.s. |
-traditional | 该选项使得gcc只能接受传统Kemighan和Ritchie C编译语言具有的特性,从而使用gcc可以正确编译实用传统C(标准ANSI C语言之前的C)编译的老程序. |
-Wall | 该选项使得gcc在源文件中发现可疑的代码时给出警告.很多相关的选项可以用来更精确地控制警告信息. |
虽然-o选项通常用来制定在其中存储目标代码的文件名,但也可以用来命名其他编译阶段得到的结果文件.在下面的示例中,选项-o使得gcc命令得到的汇编语言存储在文件acode中,而不存储在默认在pgm.s:
gcc -s -o acode pgm.c
扩展名 | 文件类型 |
.a | 对象模块库 |
.c | C语言源文件 |
.C,.cc或者.cxxx | C++语言源文件 |
.i | 预处理C语言源文件得到的文件 |
.ii | 预处理C++语言源文件得到的文件 |
.m | Objective C |
.mm | Objective C++ |
.o | 对象文件 |
.s | 汇编语言源文件 |
.S | 需要预处理的汇编语言源文件 |
gcc compute.c
下面的示例实用C优化器(-O选项)再次编译compute.c,gcc将汇编并连接优化后的代码.其中使的-o选项使得可执行文件的名称为compute.
gcc -O2 -o compte compte.c
下面的示例对一个C源文件,一个汇编语言文件和一个对象文件进行编译,汇编和连接,得到一个可执行文件progo.
gcc -o progo procom.c profast.s proout.o
在下面的示例中,gcc在/lib/libm.a文件中搜索标准数学函数库,当它连接himath程序时,产生的可执行文件a.out.
gcc himath.c -lm