Linux下gcc的使用与开发_第1页
Linux下gcc的使用与开发_第2页
Linux下gcc的使用与开发_第3页
Linux下gcc的使用与开发_第4页
Linux下gcc的使用与开发_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

1、Linux下下gcc的使用与开发的使用与开发2主要内容主要内容pgcc简介简介n功能功能n命令命令p利用利用gcc编译编译c程序程序p利用利用make工具工具简化编译过程简化编译过程nmake简介简介nMakefile基本格式基本格式p调试调试n静态调试静态调试n动态调试:动态调试:gdb调试工具的使用调试工具的使用pMakefile文件的文件的自动生成自动生成3gcc简介简介p名称:名称:nGNU project C and C+ Compiler nGNU Compiler Collection p管理与维护管理与维护nGNU项目项目 p对对C/C+编译的控制编译的控制n预处理(预处理(P

2、reprocessing)n编译(编译(Compilation)n汇编(汇编(Assembly)n链接(链接(Linking 4Gcc简介简介pgcc可以使程序员灵活地控制编译过程。编译过程可以使程序员灵活地控制编译过程。编译过程一般可以分为下面四个阶段,每个阶段分别调用不一般可以分为下面四个阶段,每个阶段分别调用不同的工具进行处理,如图所示。同的工具进行处理,如图所示。预处理链接编译汇编源 程 序(*.c)可执行文件预 处 理器编译器组译器连接器5gcc的使用的使用p基本使用格式基本使用格式 n$ gcc 选项选项 p常用选项及含义常用选项及含义gccgcc常用选项常用选项选项选项含义含义-

3、o -o filefile将经过将经过gccgcc处理过的结果存为文件处理过的结果存为文件filefile,这个结果文件可能是,这个结果文件可能是预处理文件、汇编文件、目标文件或者最终的可执行文件。预处理文件、汇编文件、目标文件或者最终的可执行文件。假设被处理的源文件为假设被处理的源文件为source.suffixsource.suffix,如果这个选项被省,如果这个选项被省略了,那么生成的可执行文件默认名称为略了,那么生成的可执行文件默认名称为a.outa.out;目标文件;目标文件默认名为默认名为source.osource.o;汇编文件默认名为;汇编文件默认名为source.ssourc

4、e.s;生成的;生成的预处理文件则发送到标准输出设备。预处理文件则发送到标准输出设备。6gcc的常用选项的常用选项gccgcc常用选项常用选项选项选项含义含义-c-c仅对源文件进行编译,不链接生成可执行文件。仅对源文件进行编译,不链接生成可执行文件。在对源文件进行查错时,或只需产生目标文件在对源文件进行查错时,或只需产生目标文件时可以使用该选项。时可以使用该选项。-ggdb-ggdb在可执行文件中加入调试信息,方便进行程序在可执行文件中加入调试信息,方便进行程序的调试。如果使用中括号中的选项,表示加入的调试。如果使用中括号中的选项,表示加入gdbgdb扩展的调试信息,方便使用扩展的调试信息,方

5、便使用gdbgdb来进行调试来进行调试-O0-O0、1 1、2 2、33对生成的代码使用优化,中括号中的部分为优对生成的代码使用优化,中括号中的部分为优化级别,缺省的情况为化级别,缺省的情况为2 2级优化,级优化,0 0为不进行优为不进行优化。注意,采用更高级的优化并不一定得到效化。注意,采用更高级的优化并不一定得到效率更高的代码。率更高的代码。-D -D name=definitionname=definition将名为将名为namename的宏定义为的宏定义为definitiondefinition,如果中括,如果中括号中的部分缺省,则宏被定义为号中的部分缺省,则宏被定义为1 17gcc的

6、常用选项的常用选项gccgcc常用选项常用选项选项选项含义含义-I -I dirdir在编译源程序时增加一个搜索头文件的额外目录在编译源程序时增加一个搜索头文件的额外目录dirdir,即,即includeinclude增加一个搜索的额外目录。增加一个搜索的额外目录。-L -L dirdir在编译源文件时增加一个搜索库文件的额外目录在编译源文件时增加一个搜索库文件的额外目录dirdir-l -l librarylibrary在编译链接文件时增加一个额外的库,库名为在编译链接文件时增加一个额外的库,库名为librarylibrary.a.a-w-w禁止所有警告禁止所有警告-W -W warning

7、warning允许产生允许产生warningwarning类型的警告,类型的警告,warningwarning可以是:可以是:mainmain、unusedunused等很多取值,最常用是等很多取值,最常用是-Wall-Wall,表示产生所有警,表示产生所有警告。如果告。如果warningwarning取值为取值为errorerror,其含义是将所有警告作,其含义是将所有警告作为错误(为错误(errorerror),即出现警告就停止编译。),即出现警告就停止编译。8gcc文件扩展名规范文件扩展名规范 pgcc可以根据文件扩展名执行操作可以根据文件扩展名执行操作gccgcc文件扩展名规范文件扩展

8、名规范扩展名扩展名类型类型可进行的操作方式可进行的操作方式.c.cc c语言源程序语言源程序预处理、编译、汇编、预处理、编译、汇编、链接链接.C.C,.cc.cc,.cp.cp,.cpp.cpp,.c+.c+,.cxx.cxxc+c+语言源程序语言源程序预处理、编译、汇编、预处理、编译、汇编、链接链接.i.i预处理后的预处理后的c c语言源程序语言源程序编译、汇编、链接编译、汇编、链接.ii.ii预处理后的预处理后的c+c+语言源程序语言源程序编译、汇编、链接编译、汇编、链接.s.s预处理后的汇编程序预处理后的汇编程序汇编、链接汇编、链接.S.S未预处理的汇编程序未预处理的汇编程序预处理、汇编

9、、链接预处理、汇编、链接.h.h头文件头文件不进行任何操作不进行任何操作.o.o目标文件目标文件链接链接9使用使用gcc编译代码编译代码p源代码源代码示例源程序示例源程序hello.c#include int main(void)printf(hello gcc!rn);return 0;10生成预处理文件生成预处理文件p命令命令n$gcc E hello.c o hello.i预处理文件预处理文件hello.i的部分内容的部分内容.extern void funlockfile (FILE *_stream) ;# 679 /usr/include/stdio.h 3# 2 hello.c

10、2int main(void) printf(hello gcc!n); return 0;11生成汇编文件生成汇编文件p命令命令n$gcc S hello.c o hello.s汇编文件汇编文件hello.s的部分内容的部分内容.main:pushl%ebpmovl%esp, %ebp.addl$16, %espmovl$0, %eaxleaveret.12生成二进制文件生成二进制文件p生成目标文件生成目标文件n命令:命令:p$gcc c hello.c o hello.op生成可执行文件生成可执行文件n命令:命令:p$gcc hello.c o hellop运行程序运行程序p$./hell

11、ohello gcc!13编译多个文件编译多个文件p文件清单文件清单greeting.h #ifndef _GREETING_H #define _GREETING_Hvoid greeting (char * name);#endif greeting.c #include #include greeting.hvoid greeting (char * name)printf(Hello %s!rn,name); my_app.c #include #include greeting.h#define N 10int main(void)char nameN; printf(Your Na

12、me,Please:); scanf(%s,name); greeting(name); return 0; 14编译多个文件编译多个文件p目录结构目录结构(1)n编译命令编译命令p$ gcc my_app.c greeting.c o my_appp目录结构目录结构(2)n编译方式编译方式(1)$gcc my_app.c functions/greeting.c o my_app -I functions greeting.h./greeting.cmy_app.cgreeting.h./greeting.cmy_app.cfunctions15编译多个文件编译多个文件p目录结构目录结构(2

13、)n编译方式编译方式(2)p分步编译分步编译p命令:命令: 1、$gcc -c my_app.c -I functions 2、$gcc -c functions/greeting.c 3、$gcc my_app.o greeting.o o my_appp思路:思路: 编译每一个编译每一个.c文件,得到文件,得到.o的目标文件;的目标文件; 将每一个将每一个.o的目标文件链接成一个可执行的文件;的目标文件链接成一个可执行的文件;16使用使用make工具工具p适用场合:适用场合:n多个文件组成的软件项目多个文件组成的软件项目pMakefile文件基本格式:文件基本格式:p目标:欲生成的目标文件

14、目标:欲生成的目标文件p依赖项:生成目标需要的文件依赖项:生成目标需要的文件p原理:原理:n判断依赖项是否为最新,否则,生成新的目标判断依赖项是否为最新,否则,生成新的目标pmake工具的使用格式:工具的使用格式:nmake 命令选项命令选项 命令参数命令参数n通常使用通常使用make就可以了,就可以了,make会寻找会寻找Makefile作为编译指导作为编译指导文件;文件;目标:依赖项列表目标:依赖项列表(Tab缩进)命令缩进)命令17使用使用make工具工具pMakefile示例示例Makefile文件文件1my_app:greeting.o my_app.o2gcc my_app.o g

15、reeting.o -o my_app3greeting.o:functions/greeting.c functions/greeting.h4gcc -c functions/greeting.c5my_app.o:my_app.c functions/greeting.h6gcc c my_app.c I functions18使用使用make工具工具p目标的依赖关系目标的依赖关系my_appmy_app.ogreeting.omy_app.cFunctions/greeting.hFunctions/greeting.cgcc c my_app.c I functions gcc -c

16、 functions/greeting.c gcc my_app.o greeting.o -o my_app 19使用使用make工具工具p更实用的更实用的Makefile更实用的更实用的Makefile文件文件1OBJS = greeting.o my_app.o2CC = gcc3CFLAGS = -Wall -O g4my_app:$OBJS5$CC $OBJS -o my_app6greeting.o:functions/greeting.c functions/greeting.h7$CC $CFLAGS -c functions/greeting.c8my_app.o:my_ap

17、p.c functionsgreeting.h9$CC $CFLAGS -c my_app.c -Ifunctions20调试调试p调试调试n静态调试:静态调试:p在程序编译阶段查错并修正错误;在程序编译阶段查错并修正错误;p主要为语法错误:主要为语法错误: 输入错误;输入错误; 类型匹配错误;类型匹配错误;p排错方式:排错方式: 利用错误、警告信息,并结合源文件环境排错利用错误、警告信息,并结合源文件环境排错n动态调试:动态调试:p在程序运行阶段差错并修正错误;在程序运行阶段差错并修正错误;p主要错误类型:主要错误类型: 算法错误;算法错误; 输入错误;输入错误;p排错方式:排错方式: 利用

18、调试工具定位并修正错误;利用调试工具定位并修正错误;21调试举例调试举例p源文件源文件greeting.h #ifndef _GREETING_H #define _GREETING_Hvoid greeting (char * name);#endif greeting.c #include #include greeting.hvoid greeting (char * name)printf(Hello !rn); my_app.c 1#include 2#include greeting.h3#define N 104int main(void)56char namen; 7print

19、f(Your Name,Please:); 8scanf(%s,name)9greeting(name); 10/*return 0;*/ 11 22静态调试举例静态调试举例p分块编译分块编译ngreeting.cp$gcc -g -Wall -c functions/greeting.c-g:将调试信息加入到编译的目标文件中:将调试信息加入到编译的目标文件中 ;-Wall:将编译过程中的所有级别的警告都打印出来:将编译过程中的所有级别的警告都打印出来 ;p无错误无错误nmy_app.cp$gcc -g -Wall -c my_app.c -I functionsp参数含义同上参数含义同上p错

20、误信息:错误信息:23调试举例调试举例p错误信息:错误信息:n错误记录格式:错误记录格式:p文件名:行号:错误描述文件名:行号:错误描述my_app.c: In function main:my_app.c:6: n undeclared (first use in this function)my_app.c:6: (Each undeclared identifier is reported only oncemy_app.c:6: for each function it appears in.)my_app.c:9: parse error before greetingmy_app.

21、c:6: warning: unused variable name24静态调试举例静态调试举例p分析、定位错误(警告):分析、定位错误(警告):nmy_app.c的第的第6行:行:p描述含义:描述含义: n是一个没有声明的变量;是一个没有声明的变量;p分析:分析: 声明数字声明数字name时用到了变量时用到了变量n,但变量,但变量n在之前没有声明;在之前没有声明;p改正:改正: 声明一个新变量声明一个新变量n;或者或者 将将n改为宏改为宏Np这里取第这里取第2种改正方法;种改正方法;25静态调试举例静态调试举例nmy_app.c的第的第9行:行:p描述含义:描述含义: 在在“greeting

22、”之前出现解析错误;之前出现解析错误;p分析:分析: c中每行程序以;结束,第中每行程序以;结束,第9行行greeting之前的程序行没有以;结之前的程序行没有以;结束;束;p改正:改正: 第第8行末尾增加行末尾增加“;”p重新编译重新编译p错误信息:错误信息:my_app.c: In function main:my_app.c:11: warning: control reaches end of non-void function26静态调试举例静态调试举例p分析、定位错误(警告):分析、定位错误(警告):n警告:警告:my_app.c的的11行行p描述含义:描述含义: 控制以非空函数结

23、束;控制以非空函数结束;p分析:分析: main函数返回类型为函数返回类型为int,源程序没有以,源程序没有以return 整数整数形式结束;形式结束;p改正:改正: 将将main改为返回改为返回void类型;类型;或者:或者: 在在main程序后增加程序后增加return 返回语句;返回语句; 采用第采用第2种解决方式;种解决方式;p重新编译,无错误或警告信息,完成静态调试重新编译,无错误或警告信息,完成静态调试27静态调试举例静态调试举例p静态调试总结静态调试总结n主要为语法错误:主要为语法错误:p输入错误;输入错误;p类型匹配错误;类型匹配错误;n分析信息:分析信息:p主要来自主要来自g

24、cc编译时产生的提示信息编译时产生的提示信息n错误警告定位:错误警告定位:p不一定在提示信息描述的地方;不一定在提示信息描述的地方;p综合分析提示信息及提示行的上下文环境,定位并修正错误、综合分析提示信息及提示行的上下文环境,定位并修正错误、警告。警告。p有的警告可以不用修复;有的警告可以不用修复;28动态调试举例动态调试举例p 常见的动态调试方法:常见的动态调试方法:n增加调试语句增加调试语句 ;n记录程序的执行状况记录程序的执行状况 ;n观察内存变化观察内存变化 ;n使用调试工具;使用调试工具;pGUN Debuger(gdb)的功能:的功能:n启动程序,设置程序执行的上下文环境;启动程序

25、,设置程序执行的上下文环境;n在指定的条件下停止程序;在指定的条件下停止程序;n程序停止时,检查程序的状态;程序停止时,检查程序的状态;n在程序运行时,改变程序状态,使其按照改变后的状态在程序运行时,改变程序状态,使其按照改变后的状态继续执行。继续执行。29动态调试举例动态调试举例gdbgdb常用的调试命令常用的调试命令命令命令含义含义file指定需要进行调试的程序step单步(行)执行,如果遇到函数会进入函数内部next单步(行)执行,如果遇到函数不会进入函数内部run启动被执行的程序quit退出gdb调试环境print查看变量或者表达式的值break设置断点,程序执行到断点就会暂停起来sh

26、ell执行其后的shell命令list查看指定文件或者函数的源代码,并标出行号30动态调试举例动态调试举例p对静态调试中的例子继续进行动态调试对静态调试中的例子继续进行动态调试p工具:工具:gdb,启动,启动gdb:$gdbGNU gdb Red Hat Linux (5.3post-0.20021129.18rh)Copyright 2003 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it

27、 and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is absolutely no warranty for GDB. Type show warranty for details.This GDB was configured as i386-redhat-linux-gnu.(gdb)启动命令启动命令启动提示启动提示启动完毕启动完毕31动态调试举例动态调试举例p调试指定程序(调试指定程序(./my_app)n问题:问题:p期望的输出和实

28、际输出不一致期望的输出和实际输出不一致(gdb) file ./my_appReading symbols from ./my_app.done(gdb) runStarting program: /home/tom/shell_script/cpp/my_app/my_appYour Name,Please:tomHello !Program exited normally.(gdb)加载调试程序加载调试程序启动调试程序启动调试程序程序输出程序输出提示信息提示信息32动态调试举例动态调试举例p初次错误定位:初次错误定位:n输出有错误输出有错误p错误定位错误定位n重新开始一次调试重新开始一次调

29、试;n启动启动gdb;n加载调试程序(加载调试程序(./my_app);n查看程序源代码查看程序源代码p命令:命令:list 文件名文件名33动态调试举例动态调试举例p(gdb) list my_app.c:1,20p1#include p2#include greeting.hp3#define N 10p4int main(void)p5p6char nameN;p7printf(Your Name,Please:);p8scanf(%s,name);p9greeting(name);p10return 0;p11p(gdb) break 7pBreakPoint 1 at 0 x8048

30、384: file my_app.c, line 7.p在程序第在程序第7行设置断点行设置断点n命令:命令: (gdb) break 7查看源代码查看源代码设置断点设置断点提示信息提示信息34动态调试举例动态调试举例p错误详细定位错误详细定位1(gdb) run2Starting program: /home/tom/shell_script/cpp/my_app/my_app3Breakpoint 1,main()() at my_app.c:747printf(Your Name,Please:);5(gdb) next68 scanf(%s,name);7(gdb) next8Your

31、Name,Please:tom99 greeting(name);启动调试程序启动调试程序断点激活断点激活步进下一步步进下一步35动态调试举例动态调试举例10(gdb) print name11$1 = “tom000 00000012(gdb) step13greeting(name=0 xbfffdf20 “tom”)at functions/greeting.c:5145 printf(”Hello !rn”);15(gdb) step16Hello !176 18(gdb) kill19Kill the programe being debugged?(y or n)y20(gdb)

32、quitp错误详细定位错误详细定位查看变量值查看变量值进入函数内部进入函数内部步进执行步进执行停止调试停止调试退出退出gdb36动态调试举例动态调试举例p分析分析:n11行说明行说明name变量被正确赋值(变量被正确赋值(tom)n13行说明行说明name变量值被正确赋予变量值被正确赋予greeting的参数变的参数变量量namen16说明打印出现了错误,即错误出现在函数说明打印出现了错误,即错误出现在函数greeting中;中;p综合分析综合分析n错误出现在错误出现在greeting.c的第的第5行;行;n原因:原因:p没有输出字符串的格式不对;没有输出字符串的格式不对;p改正错误改正错误3

33、7动态调试总结动态调试总结p动态调试总结动态调试总结n主要错误类型:主要错误类型:p算法错误;算法错误;p输入错误;输入错误;n定位方法:定位方法:p设置断点;设置断点;p单步步进执行;单步步进执行;p查看变量取值变化;查看变量取值变化;p反复执行,逐步缩小错误范围;反复执行,逐步缩小错误范围;38使用使用automake和和autoconf产生产生Makefile在开始使用在开始使用automakeautomake和和autoconfautoconf之前,请先确认系统之前,请先确认系统已经安装以下的软件:已经安装以下的软件: automakeautomake:是一个从是一个从Makefile

34、.am文件自动生成文件自动生成Makefile.in的工具。为了生成的工具。为了生成Makefile.in,automake还需用到还需用到perl 。 autoconf:autoconf:是一个用于生成可以自动地配置软件源码包,是一个用于生成可以自动地配置软件源码包,用以适应多种用以适应多种UNIX类系统的类系统的shell脚本工具,其中脚本工具,其中autoconf需要用到需要用到 m4,便于生成脚本。,便于生成脚本。 GNU m4GNU m4 PerlPerl GNU Libtool (GNU Libtool (非必须,如果你需要产生非必须,如果你需要产生 shared shared l

35、ibrary) library) ;39使用使用Automake和和Autoconf产生产生Makefile实例:下面用hello.c 来作为例子进行说明在工作目录下建立一个新的子目录devel,再在devel下建立一个hello的子目录,这个目录将作为存放 hello 这个程序及其相关文件的地方:用编辑器写个hello.c文件:#include int main(int argc, char* argv) printf(Hello, GNU!n); return 0;40使用使用automake和和autoconf产生产生Makefile接下来就要使用 autoconf 及 automake

36、 来产生Makefile文件,步骤如下:(1)用autoscan 产生一个configure.in的模板。执行 autoscan 后会产生一个configure.scan 的文件,可以用它做为configure.in文件的模板: autoscan是用来扫描源代码目录生成 configure.scan文件的。autoscan可以用目录名做为参数,但如果你不使用参数的话,那么autoscan将认为使用的是当前目录。 autoscan将扫描你所指定目录中的源文件,并创建configure.scan文件。 (2)编辑configure.scan文件,并且把文件名改成configure.in 41使用使

37、用automake和和autoconf产生产生Makefilepconfigure.in文件的内容是一些宏,这些宏经 过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。Configure.scan文件格式:# Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) AC_INIT(FILE)AM_INIT_AUTOMAKE(

38、FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR(config.h.in) AC_CONFIG_HEADER(config.h) # Checks for programs. AC_PROG_CC # Checks for libraries. # FIXME: Replace main with a function in -lpthread: AC_CHECK_LIB(pthread, main) # Checks for header files. Checks for typedefs, structure

39、s, and compiler characteristics. # Checks for library functions. AC_OUTPUT (FILE)这个宏用来检查源代码所在的路这个宏用来检查源代码所在的路径。径。这个宏是必须的,它描述了我们这个宏是必须的,它描述了我们将要生成的软件包的名字及其版将要生成的软件包的名字及其版本号本号.这个宏将检查系统这个宏将检查系统所用的所用的C编译器。编译器。我们要输出的我们要输出的Makefile的名字。的名字。本例中的Configure.scan文件内容:# -*- Autoconf -*-# Process this file with a

40、utoconf to produce a configure script.AC_INIT(hello,1.0)AM_INIT_AUTOMAKE# Checks for programs.AC_PROG_CC# Checks for libraries.# Checks for header files.# Checks for typedefs, structures, and compiler characteristics.# Checks for library functions.AC_OUTPUT(Makefile) 44使用使用automake和和autoconf产生产生Makefile(3)执行aclocal和autoconf ,分别会产生

温馨提示

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

评论

0/150

提交评论