《Linux C从入门到精通》.明日科技.第05章.GCC 编译器_第1页
《Linux C从入门到精通》.明日科技.第05章.GCC 编译器_第2页
《Linux C从入门到精通》.明日科技.第05章.GCC 编译器_第3页
《Linux C从入门到精通》.明日科技.第05章.GCC 编译器_第4页
《Linux C从入门到精通》.明日科技.第05章.GCC 编译器_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

初识gcc编译器本讲大纲:第一次编译gcc选项概述警告gcc调试代码优化第一次编译在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器。目前Linux下最常用的C语言编译器是GCC(GNUCompilerCollection),它是GNU项目中符合ANSIC标准的编译系统,能够编译用C、C++和ObjectC等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等。Linux系统下的Gcc(GNUCCompiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。5.1.1第一次编译在学习使用GCC之前,下面的这个例子能够帮助用户迅速理解GCC的工作原理,并将其立即运用到实际的项目开发中去。首先用熟悉的编辑器输入如下所示的代码:#include<stdio.h>intmain(){

printf("hello

word!Linux

c!\n");return0;}将上面的代码保存为hello.c,然后用户就可以在终端中对上面的C语言代码进行编译了。并且我们给编译出的新文件其名为hello,最后执行编译好的文件。上面在编译的时候,为gcc的后面加入了选项-o进行新文件的重命名,如果不加入这个选项,那么新文件就会默认为a.out,如果再次编译其他的文件,同样不进行重命名的话,那么这里的a.out将会被覆盖掉。gcc选项概述在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。Gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。Gcc最基本的用法是∶gcc[options][filenames]其中options就是编译器所需要的参数,filenames给出相关的文件名称。-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。-ooutput_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。警告GCC包含完整的出错检查和警告提示功能,它们可以帮助Linux程序员写出更加专业和优美的代码。先来看看下面所示的程序,这段代码写得很有问题,仔细检查一下不难挑出很多毛病:#include<stdio.h>voidmain(void){longlong

int

var=1;printf("ItisnotstandardCcode!\n");}main函数的返回值被声明为void,但实际上应该是int;使用了GNU语法扩展,即使用longlong来声明64位整数,不符合ANSI/ISOC语言标准;main函数在终止前没有调用return语句。下面来看看GCC是如何来发现这些错误的。当GCC在编译不符合ANSI/ISOC语言标准的源代码时,如果加上了-pedantic选项,那么使用了扩展语法的地方将产生相应的警告信息:#gcc-pedanticillcode.c-oillcode

illcode.c:Infunction`main':illcode.c:9:ISOC89doesnotsupport`longlong'illcode.c:8:returntypeof`main'isnot`int'值得注意的是,-pedantic编译选项并不能保证被编译程序与ANSI/ISOC标准的完全兼容,它仅仅只能用来帮助Linux程序员离这个目标越来越近。或者换句话说,-pedantic选项能够帮助程序员发现一些不符合ANSI/ISOC标准的代码,但不是全部,事实上只有ANSI/ISOC语言标准中要求进行编译器诊断的那些情况,才有可能被GCC发现并提出警告。除了-pedantic之外,GCC还有一些其它编译选项也能够产生有用的警告信息。这些选项大多以-W开头,其中最有价值的当数-Wall了,使用它能够使GCC产生尽可能多的警告信息:#gcc-Wallillcode.c-oillcodeillcode.c:8:warning:returntypeof`main'isnot`int'illcode.c:Infunction`main':illcode.c:9:warning:unusedvariable`var'GCC给出的警告信息虽然从严格意义上说不能算作是错误,但却很可能成为错误的栖身之所。但是作为一个优秀的Linux程序员应该尽量避免产生警告信息,使自己的代码始终保持简洁、优美和健壮的特性。在处理警告方面,另一个常用的编译选项是-Werror,它要求GCC将所有的警告当成错误进行处理,这在使用自动编译工具(如Make等)时非常有用。如果编译时带上-Werror选项,那么GCC会在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改。只有当相应的警告信息消除时,才可能将编译过程继续朝前推进。执行情况如下:#gcc-Wall-Werror

illcode.c-oillcodecc1:warningsbeingtreatedaserrorsillcode.c:8:warning:returntypeof`main'isnot`int'illcode.c:Infunction`main':illcode.c:9:warning:unusedvariable`var'对Linux程序员来讲,GCC给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更加健壮的程序,而且还是跟踪和调试程序的有力工具。建议在用GCC编译源代码时始终带上-Wall选项,并把它逐渐培养成为一种习惯,这对找出常见的隐式编程错误很有帮助。

gcc调试代码优化标题gcc编译的基本流程本讲大纲:C预处理编译汇编连接C预处理C预处理器CPP是用来完成对于程序中的宏定义等相关内容进行先期的处理。一般是指那些前面含有“#”号的语句,这些语句一般会在CPP中处理。例如:#defineMR(25*4)Printf(“%d”,MR*5);经过CPP的处理后,就会变成如下格式传递到代码中:printf(“%d”,(25*4)*5)其实不难看出,CPP的作用就是解释后定义和处理包含文件。在gcc中使用时,gcc会自动调用CPP预处理器。编译编译的过程就是将输入的源代码和预处理相关文件编译为“.o”的目标文件。汇编在使用gcc编译程序的时候,会产生一些汇编代码,而处理这些汇编代码就需要使用汇编器as,as可以处理这些汇编代码,从而使其成为目标文件,最终目标文件转换成.o文件或其他可执行文件。而且as汇编器和CPP一样,可以被gcc自动调用。连接在处理一个较大的C语言项目时,我们通常会将程序分割成很多模块,那么这时候就需要使用连接器将这些模块组合起来,并且结合相应的C语言函数库和初始代码,产生最后的可执行文件。连接器一般在一些大的程序和项目中,对最后生成可执行文件起着重要的作用。虽然gcc可以自动调用连接器,但是为了更好的控制连接过程,建议最好手动调用连接器。

其他编译工具简介本讲大纲:C++编译器g++EGCSf2c和p2cC++编译器g++

Gcc编译器虽然可以对c++的源代码进行编译,但是需要手动的设置一些选项,在使用时很不方便,而且容易产生一些错误。而g++编译器使用的选项和gcc一样,但是在使用扩展名的时候,一般使用.cxx,这样就可以很好的与c代码进行区别。G++命令格式如下:g++[-options][filename

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论