您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Linux系统C编程
gcc编程gcc主要内容gcc简介利用gcc编译c程序利用make工具简化编译过程调试开发工具环境开发工具:编辑工具、编译工具和调试工具,甚至配置工具和项目管理工具。开发环境:(1)基于文本的:vim+gcc+gdb+make(2)集成开发平台:Eclipse+CDT、基于文本的开发平台编辑工具:vim,emacs。编译工具:gcc,要使用指令完成编译,比如:gcc–ohellohello.c调试工具:gdb。项目管理工具:make,编写makefile文档来完成相关的一系列gcc指令。gcc简介名称:GNUprojectCandC++CompilerGNUCompilerCollectiongcc是一个全功能的ANSIC兼容编译器,它是所有UNIX系统可用的C编译器。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。gcc简介对C/C++编译的控制预处理:对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。编译:就是把C/C++代码“翻译”成汇编代码。汇编:将第二步输出的汇编代码翻译成符合一定格式的机器代码,生成以.s为后缀的目标文件。链接:将上步生成的目标文件和系统库的目标文件和库文件链接起来,最终生成了可以在特定平台运行的可执行文件。编译过程的四个阶段:预处理链接编译组译源程序(*.c)可执行文件预处理器编译器组译器连接器gcc的使用基本使用格式$gcc[选项][文件名]例://test.c#includestdio.hvoidmain(){printf(“HelloWorld!\n”);}$gcctest.c$./a.outHelloWorld!或$gcc-otesttest.c$./testHelloWorld!常用选项及含义gcc常用选项选项含义-ofile将经过gcc处理过的结果存为文件file,这个结果文件可能是预处理文件、汇编文件、目标文件或者最终的可执行文件。假设被处理的源文件为source.suffix,如果这个选项被省略了,那么生成的可执行文件默认名称为a.out;目标文件默认名为source.o;汇编文件默认名为source.s;生成的预处理文件则发送到标准输出设备。gcc的常用选项-c只编译,不链接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件。在对源文件进行查错时,或只需产生目标文件时可以使用该选项。-g[gdb]在可执行文件中加入调试信息,方便进行程序的调试。如果使用中括号中的选项,表示加入gdb扩展的调试信息,方便使用gdb来进行调试-O[0、1、2、3]对生成的代码使用优化,中括号中的部分为优化级别,缺省的情况为2级优化,0为不进行优化。注意,采用更高级的优化并不一定得到效率更高的代码。gcc的常用选项-w禁止所有警告-Wwarning允许产生warning类型的警告,warning可以是:main、unused等很多取值,最常用是-Wall,表示产生所有警告。如果warning取值为error,其含义是将所有警告作为错误(error),即出现警告就停止编译。-pedantic[-errors]表示gcc只发出ANSI/ISOC标准列出的所有警告,-pedantic–errors仅仅针对错误。-ansi支持ANSI/ISOC的标准语法,取消GNU的语法中与该标准有冲突的部分,但并不保证生成与ANSI兼容代码。-Wall:允许所有有用的警告(建议总是使用该选项)/*bad.c*/#includestdio.hintmain(intargc,char**argv){printf(“Twoplustwois%f\n”,4);return0;}例1:$gccbad.c–obad例2:$gcc–Wallbad.c–obad12例1:-o:定义输出文件例:编译多个源文件$gcc-Wallmain.chello.c-ohelloworld/*hello.h*/voidhello(constchar*name);/*hello.c*/#includestdio.h#includehello.hvoidhello(constchar*name){printf(Hello,%s!\n,name);}/*main.c*/#includehello.hintmain(intargc,char**argv){hello(world);return0;}13例2:-l:链接外部库文件•库是已经编译好并能被链接入程序的对象文件的集合。库中提供一些最常用的系统函数,比如象C的数学库中求平方根函数sqrt。•库通常被存储在扩展名为“.a”或“.so”的特殊归档文件中。•C标准库自身存放在“/usr/lib/libc.a”中,包含ANSI/ISOC标准指定的各个函数,是默认自动加载的库。/*sqrt.c*/#includestdio.h#includemath.hintmain(intargc,char**argv){doubler=sqrt(3.0);printf((Thesquarerootof3.0is%f\n,r);return0;}例:$gcc-Wallsqrt.c-osqrt14例:-L:设置库文件的搜索路径•如果链接时用到的库不在gcc用到的标准库目录中,就会报这样的错。/usr/local/lib//usr/lib/例:$gcc-Wall-L/tmp/libsqrt.c-lm-osqrt-L/tmp/lib15例:-I:设置头文件的搜索路径•如果头文件不在gcc用到的标准include文件路径中,就会报这样的错。/usr/local/include//usr/include/例:$gcc-Wall-I/tmp/includesqrt.c-lm-osqrt-I/tmp/include16例:gcc文件扩展名规范gcc可以根据文件扩展名执行操作gcc文件扩展名规范扩展名类型可进行的操作方式.cc语言源程序预处理、编译、汇编、链接.C,.cc,.cp,.cpp,.c++,.cxxc++语言源程序预处理、编译、汇编、链接.i预处理后的c语言源程序编译、汇编、链接.ii预处理后的c++语言源程序编译、汇编、链接.s预处理后的汇编程序汇编、链接.S未预处理的汇编程序预处理、汇编、链接.h头文件不进行任何操作.o目标文件链接使用gcc编译代码源代码示例源程序——hello.c#includestdio.hintmain(void){printf(hellogcc!\r\n);return0;}生成预处理文件命令:E选项使得gcc生成预处理文件后停止。$gcc–Ehello.c–ohello.i预处理文件hello.i的部分内容......externvoidfunlockfile(FILE*__stream);#679/usr/include/stdio.h3#2hello.c2intmain(void){printf(hellogcc!\n);return0;}生成汇编文件命令$gcc–Shello.c–ohello.s汇编文件hello.s的部分内容......main:pushl%ebpmovl%esp,%ebp........addl$16,%espmovl$0,%eaxleaveret......生成二进制文件生成目标文件命令:•$gcc–chello.c–ohello.o生成可执行文件命令:•$gcchello.c–ohello•运行程序•$./hellohellogcc!利用gcc开发C语言程序开发C/C++程序的基本步骤是:首先利用文本编辑工具编写源代码,然后将源代码作为输入文件,通过使用不同的控制参数控制gcc实现代码的预处理、编译、汇编、链接等步骤,生成最终的可执行文件。多个文件的C程序为了方便代码重用,通常将主函数和其他函数放在不同文件中的方法。每个函数都有函数声明(函数头)和函数实现(函数体)两部分组成。函数头一般放在头文件中(*.h)中,而函数的定义文件放在实现文件(*.c、*.cpp)中编译多个文件greeting.h#ifndef_GREETING_H#define_GREETING_Hvoidgreeting(char*name);#endifgreeting.c#includestdio.h#includegreeting.hvoidgreeting(char*name){printf(Hello%s!\r\n,name);}my_app.c#includestdio.h#includegreeting.h#defineN10intmain(void){charname[N];printf(YourName,Please:);scanf(%s,name);greeting(name);return0;}假设3个文件保存在同一个目录下面,如果还使用:命令:$gccmy_app.c–omy_app会编译通过吗?greeting.h./greeting.cmy_app.c编译多个文件目录结构(1)编译命令•$gccmy_app.cgreeting.c–omy_app目录结构(2)编译方式(1)$gccmy_app.cfunctions/greeting.c–omy_app-Ifunctionsgreeting.h./greeting.cmy_app.cgreeting.h./greeting.cmy_app.cfunctions编译多个文件目录结构(2)编译方式(2)•分步编译•命令:–1、$gcc-cmy_app.c-Ifunctions–2、$gcc-cfunctions/greeting.c–3、$gccmy_app.ogreeting.o–omy_app•思路:–编译每一个.c文件,得到.o的目标文件;–将每一个.o的目标文件链接成一个可执行的文件;
本文标题:Linux系统C编程
链接地址:https://www.777doc.com/doc-5017738 .html