LinuxC编程基础-G.ppt_第1页
LinuxC编程基础-G.ppt_第2页
LinuxC编程基础-G.ppt_第3页
LinuxC编程基础-G.ppt_第4页
LinuxC编程基础-G.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

第二章LinuxC编程基础-GCC,主要内容,gcc简介利用gcc编译c程序利用make工具简化编译过程调试,开发工具环境,开发工具:编辑工具、编译工具和调试工具,甚至配置工具和项目管理工具。开发环境:(1)基于文本的:vim+gcc+gdb+make(2)集成开发平台:Eclipse+CDT、,基于文本的开发平台,编辑工具:vim,emacs。编译工具:gcc,要使用指令完成编译,比如:gccohellohello.c调试工具:gdb。项目管理工具:make,编写makefile文档来完成相关的一系列gcc指令。,gcc简介,名称:GNUprojectCandC+CompilerGNUCompilerCollectiongcc是一个全功能的ANSIC兼容编译器,它是所有UNIX系统可用的C编译器。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%30%。,gcc简介,对C/C+编译的控制预处理:对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。编译:就是把C/C+代码“翻译”成汇编代码。汇编:将第二步输出的汇编代码翻译成符合一定格式的机器代码,生成以.s为后缀的目标文件。链接:将上步生成的目标文件和系统库的目标文件和库文件链接起来,最终生成了可以在特定平台运行的可执行文件。,编译过程的四个阶段:,gcc的使用,基本使用格式$gcc选项文件名例:,/text.c#includevoidmain()printf(“HelloWorld!n”);,$gcctest.c$./a.outHelloWorld!或$gcc-otesttest.c$./testHelloWorld!,常用选项及含义,gcc的常用选项,gcc的常用选项,gcc的常用选项,-Wall:允许所有有用的警告(建议总是使用该选项),/*bad.c*/#includeintmain(intargc,char*argv)printf(“Twoplustwois%fn”,4);return0;,例1:$gccbad.cobad例2:$gccWallbad.cobad,13,例1:,-o:定义输出文件,例:编译多个源文件$gcc-Wallmain.chello.c-ohelloworld,/*hello.h*/voidhello(constchar*name);,/*hello.c*/#include#includehello.hvoidhello(constchar*name)printf(Hello,%s!n,name);,/*main.c*/#includehello.hintmain(intargc,char*argv)hello(world);return0;,14,例2:,-l:链接外部库文件,库是已经编译好并能被链接入程序的对象文件的集合。库中提供一些最常用的系统函数,比如象C的数学库中求平方根函数sqrt。,库通常被存储在扩展名为“.a”或“.so”的特殊归档文件中。,C标准库自身存放在“/usr/lib/libc.a”中,包含ANSI/ISOC标准指定的各个函数,是默认自动加载的库。,/*sqrt.c*/#include#includeintmain(intargc,char*argv)doubler=sqrt(3.0);printf(Thesquarerootof3.0is%fn,r);return0;,例:$gcc-Wallsqrt.c-osqrt,ccbR6Ojm.o:Infunctionmain:ccbR6Ojm.o(.text+0 x19):undefinedreferencetosqrt,15,例:,-l:链接外部库文件,函数sqrt()并不定义在源程序中或默认的C库“libc.a”中。,为了使得编译器能把sqrt()函数链接到主程序“sqrt.c”,需要提供“libm.a”库。,例:$gcc-Wallsqrt.c/usr/lib/libm.a-osqrt,/usr/lib/libm.a,-lm,$gcc-Wallsqrt.c-lm-osqrt,编译器选项“-lNAME”试图链接标准库目录下的文件名为“libNAME.a”中的对象文件,16,例:,函数库的链接次序,原则:包含函数定义的库应该出现在任何使用到该函数的源文件和对象文件之后,例1:$gcc-Wall-lmsqrt.c-osqrt(incorrect)$gcc-Wallsqrt.c-lm-osqrt(correct),例2:$gcc-Wallsqrt.c-lglpk-lm-osqrt,程序“sqrt.c”用到了GNULinearProgramming库“libglpk.a”,而该库又依次用到数学库“libm.a”,那么应当这么编译:,17,例:,-L:设置库文件的搜索路径,如果链接时用到的库不在gcc用到的标准库目录中,就会报这样的错。,/usr/local/lib/usr/lib/,例:$gcc-Wall-L/tmp/libsqrt.c-lm-osqrt,-L/tmp/lib,18,例:,-I:设置头文件的搜索路径,如果头文件不在gcc用到的标准include文件路径中,就会报这样的错。,/usr/local/include/usr/include/,例:$gcc-Wall-I/tmp/includesqrt.c-lm-osqrt,-I/tmp/include,19,例:,gcc文件扩展名规范,gcc可以根据文件扩展名执行操作,使用gcc编译代码,源代码,示例源程序hello.c#includeintmain(void)printf(hellogcc!rn);return0;,生成预处理文件,命令:E选项使得gcc生成预处理文件后停止。$gccEhello.cohello.i,预处理文件hello.i的部分内容.externvoidfunlockfile(FILE*_stream);#679/usr/include/stdio.h3#2hello.c2intmain(void)printf(hellogcc!n);return0;,生成汇编文件,命令$gccShello.cohello.s,汇编文件hello.s的部分内容.main:pushl%ebpmovl%esp,%ebp.addl$16,%espmovl$0,%eaxleaveret.,生成二进制文件,生成目标文件命令:$gccchello.cohello.o生成可执行文件命令:$gcchello.cohello运行程序$./hellohellogcc!,利用gcc开发C语言程序,开发C/C+程序的基本步骤是:首先利用文本编辑工具编写源代码,然后将源代码作为输入文件,通过使用不同的控制参数控制gcc实现代码的预处理、编译、汇编、链接等步骤,生成最终的可执行文件。,简单C语言程序my_app.c,#include#defineN10Voidgreeting(char*name);intmain(void)charnameN;printf(YourName,Please:);,scanf(%s,name);greeting(name);return0;voidgreeting(char*name)printf(Hello%s!rn,name);,使用什么命令生成可执行文件?,$gccmy_y_app,多个文件的C程序,为了方便代码重用,通常将主函数和其他函数放在不同文件中的方法。每个函数都有函数声明(函数头)和函数实现(函数体)两部分组成。函数头一般放在头文件中(*.h)中,而函数的定义文件放在实现文件(*.c、*.cpp)中,编译多个文件,假设3个文件保存在同一个目录下面,如果还使用:命令:$gccmy_y_app会编译通过吗?,编译多个文件,目录结构(1)编译命令$gccmy_y_app目录结构(2)编译方式(1)$gccmy_app.cfunctions/y_app-Ifunctions,编译多个文件,目录结构(2)编译方式(2)分步编译命令:1、$gcc-cmy_app.c-Ifunctions2、$gcc-cfunctions/greeting.c3、$gccmy_app.ogreeting.oomy_app思路:编译每一个.c文件,得到.o的目标文件;将每一个.o的目标文件链接成一个可执行的文件;,GNUC

温馨提示

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

最新文档

评论

0/150

提交评论