您的位置:首页 > 运维架构 > Linux

[linux命令] gcc C和C++程序编译

2014-05-08 16:17 399 查看

编译C和C++程序.

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编译器介绍,但大多数情况下它也适用于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页以获得详细信息.
-pedanticGNU C编译器接收的C语言包含一些标准ANSI C语言没有特性.使用该选项强制gcc放弃C语言的扩展,接收标准C语言的特性.
-Q显示gcc编译的函数名和每次编译的统计信息.
-S(suppress) 禁止编译过程中对源代码文件的汇编连接步骤.得到的汇编语言文件的扩展名为.s.
-traditional该选项使得gcc只能接受传统Kemighan和Ritchie C编译语言具有的特性,从而使用gcc可以正确编译实用传统C(标准ANSI C语言之前的C)编译的老程序.
-Wall该选项使得gcc在源文件中发现可疑的代码时给出警告.很多相关的选项可以用来更精确地控制警告信息.

注意

前面的选项列表仅仅时GNU C编译器的整个选项即可中的一个小部分.查看gcc 的info页可以获得完整列表.

虽然-o选项通常用来制定在其中存储目标代码的文件名,但也可以用来命名其他编译阶段得到的结果文件.在下面的示例中,选项-o使得gcc命令得到的汇编语言存储在文件acode中,而不存储在默认在pgm.s:

gcc -s -o acode pgm.c


lint实用程序的很多UNIX系统上可用,但在linux和Mac OS X中不可用.选项 -Wall可以完成很多检查功能,可以用来替换lint.

扩展名文件类型
.a对象模块库
.cC语言源文件
.C,.cc或者.cxxxC++语言源文件
.i预处理C语言源文件得到的文件
.ii预处理C++语言源文件得到的文件
.mObjective C
.mmObjective C++
.o对象文件
.s汇编语言源文件
.S需要预处理的汇编语言源文件

示例

第一个示例编译,汇编,连接一个C语言程序compute.c.产生的可执行文件为a.out.中间得到的对象文件被gcc实用程序删除.
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


......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: