欢迎来到天天文库
浏览记录
ID:30427089
大小:85.47 KB
页数:12页
时间:2018-12-29
《linux下gcc编译器起步》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Linux下gcc编译器起步注:此文部分内容转载在学习使用GCC之前,下面的这个例子能够帮助用户迅速理解GCC的工作原理,并将其立即运用到实际的项目开发中去。首先用熟悉的编辑器输入清单1所示的代码:清单1:hello.cCODE:#includestdio.hintmain(void){printf("Helloworld,Linuxprogramming!");return0;}然后执行下面的命令编译和运行这段程序:CODE:#gcchello.c-ohello#./helloHelloworld,Linuxprogr
2、amming!警告:输入gcchello.c-ohello后出现下列错误:bash:gcc:commandnotfound,是因为gcc未安装。redhat9.0安装gcc在X-window下选"主菜单"──"系统设置"──"添加/删除应用程序"──"开发工具"中的gcc并安装它从程序员的角度看,只需简单地执行一条GCC命令就可以了,但从编译器的角度来看,却需要完成一系列非常繁杂的工作。首先,GCC需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入"#include"语句所包含的内容;接着,GCC会调用c
3、cl和as将处理后的源代码编译成目标代码;最后,GCC会调用链接程序ld,把生成的目标代码链接成一个可执行程序。为了更好地理解GCC的工作过程,可以把上述编译过程分成几个步骤单独进行,并观察每步的运行结果。第一步是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程:CODE:#gcc-Ehello.c-ohello.i此时若查看hello.cpp文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而其它应当被预处理的宏定义也都做了相应的处理。下一步是将hello.i编译为目标代码,这可以通过使用-c参数
4、来完成:CODE:#gcc-chello.i-ohello.oGCC默认将.i文件看成是预处理后的C语言源代码,因此上述命令将自动跳过预处理步骤而开始执行编译过程,也可以使用-x参数让GCC从指定的步骤开始编译。最后一步是将生成的目标文件链接成可执行文件:CODE:#gcchello.o-ohello在采用模块化的设计思想进行软件开发时,通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用GCC能够很好地管理这些编译单元。假设有一个由foo1.c和foo2.c两个源文件组成的程序,为了对它们进行编译,并最终生
5、成可执行程序foo,可以使用下面这条命令:CODE:#gccfoo1.cfoo2.c-ofoo如果同时处理的文件不止一个,GCC仍然会按照预处理、编译和链接的过程依次进行。如果深究起来,上面这条命令大致相当于依次执行如下三条命令:CODE:#gcc-cfoo1.c-ofoo1.o#gcc-cfoo2.c-ofoo2.o#gccfoo1.ofoo2.o-ofoo在编译一个包含许多源文件的工程时,若只用一条GCC命令来完成编译是非常浪费时间的。假设项目中有100个源文件需要编译,并且每个源文件中都包含10000行代码,如果像上面
6、那样仅用一条GCC命令来完成编译工作,那么GCC需要将每个源文件都重新编译一遍,然后再全部连接起来。很显然,这样浪费的时间相当多,尤其是当用户只是修改了其中某一个文件的时候,完全没有必要将每个文件都重新编译一遍,因为很多已经生成的目标文件是不会改变的。要解决这个问题,关键是要灵活运用GCC,同时还要借助像Make这样的工具。作者:SmileAgain发布日期:2006-10-12警告提示功能GCC包含完整的出错检查和警告提示功能,它们可以帮助Linux程序员写出更加专业和优美的代码。先来读读清单2所示的程序,这段代码写得很糟
7、糕,仔细检查一下不难挑出很多毛病:◆main函数的返回值被声明为void,但实际上应该是int;◆使用了GNU语法扩展,即使用longlong来声明64位整数,不符合ANSI/ISOC语言标准;◆main函数在终止前没有调用return语句。清单2:illcode.cCODE:#includestdio.hvoidmain(void){longlongintvar=1;printf("ItisnotstandardCcode!");}下面来看看GCC是如何帮助程序员来发现这些错误的。当GCC在编译不符合ANSI/ISOC
8、语言标准的源代码时,如果加上了-pedantic选项,那么使用了扩展语法的地方将产生相应的警告信息:CODE:#gcc-pedanticillcode.c-oillcodeillcode.c:Infunction`main':illcode.c:9:ISOC89doesnotsupport
此文档下载收益归作者所有