




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章
Linux系统C语言开发工具2本章重点
Linux环境中将C程序转换成可执行文件所经历的过程和命令
gcc、make、gdb工具的使用233.1第一个LinuxC程序
例3-1:设计一个程序,在屏幕打印5行“HELLO,LINUXWORLD”。
步骤1:设计编辑源程序代码编辑程序只需要用文本编辑器vim,编辑程序在终端中输出: [root@localhostroot]#vim3-1.c
/*3-1.c程序:在屏幕上输出“这是第一个Linuxc程序!”*/#include<stdio.h>/*文件预处理,包含标准输入输出库*/intmain()/*C程序的主函数,开始入口*/{
inti,j;for(i=0,j=5;i<j;i++){ printf("HELLO,LINUXWORLD\n"); exit(0)}return0;}输入完成后存盘:按ESC键→输入“:wq”回车
343.1第一个Linuxc程序步骤2:编译程序编译程序前,最好请确认c源程序文件的存在,打开Linux终端输入“ls”命令,查看当前目录下是否有3-1.c文件;输入命令:[root@localhostroot]#gcc3-1.c;若编译时没有出现错误信息,说明程序编译成功。步骤3:运行程序编译好3-1.c程序后,默认生成的可执行文件是a.out;输入命令:[root@localhostroot]#./a.out此时系统会出现运行结果。43.2.1gcc编译器gcc是(GNUCmpilerCollection的简称),它是GNU项目中符合ANSIC标准的编译系统,能够编译用C、C++和ObjectC等语言编写的程序。cc命令可以启动C编译系统,当执行gcc时,它将完成预处理、编译、汇编和连接4个步骤并最终生成可执行代码。产生的可执行程序默认被保存为a.out文件。gcc命令可以接受多种文件类型并依据用户指定的命令行参数对它们做出相应处理。如果gcc无法根据一个文件的扩展名决定它的类型,它将假定这个文件是一个目标文件或库文件。563.2.1gcc编译器gcc编译流程673.2.1gcc编译器gcc支持编译的一些源文件的后缀及其解释783.2.1gcc编译器gcc命令语法:gcc[参数]要编译的文件[参数][目标文件]
目标文件可省略,gcc默认生成可执行的文件为a.out,如果想要生成自己命名的可执行文件,通常使用“-o”参数。
[root@localhostroot]#gcc3-1.c–o3-1
83.2.1gcc编译器例3-2:设计一个程序,要求把输入的百分制的成绩转换成五级制输出。即输入成绩大于等于90分,显示“优秀”;若成绩介于80~90分,显示“良好”;若成绩介于70~80分,显示“中等”;若成绩介于60~70分,显示“及格”;若成绩小于60分,显示“不及格”。9103.2.1gcc编译器步骤1:编辑源程序代码[root@localhostroot]#vim3-2.c10113.2.1gcc编译器步骤2:用gcc编译程序[root@localhostroot]#gcc3-2.c–o3-2步骤3:运行程序[root@localhostroot]#./3-2思考题:设计一个程序,要求输入一个数,如果此数大于0,显示“输入的为正数”,否则显示“输入的为负数”。113.2.2函数库标准系统库文件一般存放在linux文件系统/lib和/usr/lib目录中。C语言编译器需要知道要搜索哪些库文件,默认情况下,它只搜索标准C语言库。库文件必须遵循特定的命名规范并且需要在命令行中明确指定。库文件的名字总是以lib开头,随后的部分指明这是什么库(例如,c代表C语言库,m代表数学库)。文件名的最后部分以.开始,然后给出库文件的类型:
.a代表传统的静态函数库
.so代表共享函数库 例如:libm.a为静态数学函数库。123.2.2函数库1.静态库静态库,也称作归档库(archive),按惯例它们的文件名都以.a结尾。比如,标准C语言函数库/usr/lib/libc.a和X11函数库/usr/X11/lib/libX11.a。创建和维护自己的静态库:只要使用ar(代表archive,即建立归档文件)程序和gcc-c命令对函数分别进行编译。应该尽可能把函数分别保存到不同的源文件中。如果函数需要访问公共数据,则把它们放在同一个源文件中并使用在该文件中声明的静态变量。133.2.2函数库例3.5:创建一个小型函数库,它包含两个函数pro1和pro2,然后在一个示例程序中调用其中一个函数。步骤1为两个函数分别创建各自的源文件(将它们分别命名为pro1.c和pro2.c)。[root@localhostroot]#catpro1.c#include<sdtio.h>voidpro1(intarg){ printf(“hello:%d\n”,arg);}[root@localhostroot]#catpro2.c#include<sdtio.h>voidpro2(char*arg){
printf(“您好:%s\n”,arg);}143.2.2函数库步骤2分别编译这两个函数,产生要包含在库文件中的目标文件。通过调用带有-c选项的gcc编译器来实现,-c选项的作用是阻止编译器创建一个完整的程序,gcc将把源程序编译成目标程序,文件名为以.o结尾。如果此时试图创建一个完整的程序将不会成功,因为还未定义main函数。[root@localhostroot]#gcc-cpro1.cpro2.c[root@localhostroot]#ls*.opro1.opro2.o步骤3编写一个调用pro2函数的程序。首先,为库文件创建一个头文件lib.h。这个头文件将声明库文件中的函数,它应该被所有希望使用库文件的应用程序所包含。[root@localhostroot]#catlib.h/*lib.h:pro1.c,pro2.c*/voidpro1(int);voidpro2(char*);153.2.2函数库步骤4主程序(program.c),它包含库的头文件并且调用库中的一个函数。[root@localhostroot]#catprogram.c#include“lib.h”intmain(){ pro2(“Linuxworld”); exit(0);}步骤5编译并测试程序。暂时为编译器显式指定目标文件,然后要求编译器编译的文件并将其与预先编译好的目标模块pro2.o链接。[root@localhostroot]#gcc-cprogram.c[root@localhostroot]#gcc-oprogramprogram.opro2.o[root@localhostroot]#./program您好:Linuxworld163.2.2函数库步骤6创建并使用一个库文件。用ar程序创建一个归档文件并将目标文件添加进去。这个程序之所以称为ar,是因为它将若干单独的文件归并到一个大的文件中以创建归档文件。注意,也可以用ar程序来创建任何类型文件的归档文件。[root@localhostroot]#arcrvlibfoo.apro1.opro2.o函数库就可使用了。173.2.2函数库可以在编译器命令行的文件列表中添加该库文件以创建程序:[root@localhostroot]#gcc-oprogramprogram.olibfoo.a[root@localhostroot]#./program您好:Linuxworld也可以用-l选项来访问函数库,但是因为其未保存在标准位置,所以必须用-L选项来指示gcc在何处可以找到它:[root@localhostroot]#gcc-oprogramprogram.o-L.-lfoo-L.选项指示编译器在当前目录”.”中查找函数库。-lfoo选项指示编译器使用名为libfoo.a的函数库(或者名为libfoo.so的共享库,如果它存在的话)。183.2.2函数库2.共享库静态库的一个缺点,当同时运行许多应用程序并且它们都使用来自同一个函数库的函数时,就会在内存中有同一函数的多份拷贝,在程序文件自身中也有多份同样的拷贝。这将消耗大量宝贵的内存和磁盘空间。可以用共享库来实现函数的动态链接。Linux支持共享库(动态链接库)。共享库的保存位置与静态库是一样的,但共享库有不同的文件名后缀。在典型的Linux系统中,标准数学库的共享库是/usr/lib/libm.so。程序使用共享库时,它的链接方式是这样的:它本身不再包含函数代码,而是运行时可访问的共享代码。当编译好的程序被装载到内存中执行时,函数引用被解析并产生对共享库的调用,如果有必要共享库才被加载到内存中。193.3make工具Linux有个很强大的工具make,它可以管理多个模块。make工具提供灵活的机制来建立大型的软件项目。make工具依赖于一个特殊的、名字为makefile或Makefile的文件,这个文件描述了系统中各个模块之间的依赖关系。系统中部分文件改变时,make根据这些关系决定一个需要重新编译的文件的最小集合。如果软件包括几十个源文件和多个可执行文件,这时make工具特别有用。203.3.1make命令命令语法:make[选项][目标][宏定义]常用选项:-d 显示调试信息-f文件 告诉make使用指定文件作为依赖关系文件。-n 不执行makefile中的命令,只显示输出这些命令-s 执行但不显示任何信息。213.3.2make规则makefile的默认文件名为GNUmakefile、makefile或Makefile,当然也可以在make的命令行中指定别的文件名。多数Linux程序员使用第三种文件名Makefile。Makefile中包含一些规则来告诉make处理哪些文件以及如何处理这些文件。这些规则主要是描述哪些文件(称为target目标文件,不要和编译时产生的目标文件相混淆)是从哪些别的文件(称为dependency依赖文件)中产生的,以及用什么命令(command)来执行这个过程。依靠这些信息,make会对磁盘上的文件进行检查,如果目标文件的生成或被改动时的时间(称为该文件时间戳)至少比它的一个依赖文件还旧的话,make就执行相应的命令,以更新目标文件。目标文件不一定是最后的可执行文件,可以是任何一个中间文件并可以作为其他目标文件的依赖文件。223.3.2make规则一个Makefile文件主要含有一系列的make规则,每条make规则包含以下内容:目标文件列表:依赖文件列表<TAB>命令列表目标文件列表:即make最终需要创建的文件,中间用空格隔开,如可执行文件和目标文件;也可以是要执行的动作。依赖文件列表:是编译目标文件所需要的其他文件。命令(command)列表:是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为TAB字符。
除非特别指定,否则make的工作目录就是当前目录。233.3.2make规则例3.6:Makefile文件实例[root@localhostroot]#catMakefile#一个简单的Makefile的例子,以#开头的为注释行test:prog.ocode.o gcc-otestprog.ocode.o
prog.o:prog.cprog.hcode.h gcc-cprog.c-oprog.o
code.o:code.ccode.h gcc-ccode.c-ocode.o
clean: rm-f*.o243.3.2make规则调用make命令:[root@localhostroot]#maketargettarget是Makefile文件中定义的目标之一,如果省略target,make就将生成Makefile文件中定义的第一个目标。对于例3.6,单独的一个“make”命令等价于:[root@localhostroot]#maketest253.3.3Makefile中的变量Makefile里的变量就像一个环境变量。事实上,环境变量在make中也被解释成make的变量。这些变量对大小写敏感,一般使用大写宇母。Makefile中的变量是用一个字符串在Makefile中定义的,这个字符串就是变量的值。定义变量的语法:VARNAME=string引用变量的值:${VARNAME}make解释规则时,VARNAME在等式右端展开为定义它的字符串。变量一般都在Makefile的前面部分定义。按照惯例,所有的Makefile变量都应该是大写。如果变量的值发生变化,就只需要在一个地方修改,从而简化了Makefile的维护。263.3.3Makefile中的变量利用变量重写前面的Makefile:OBJS=prog.ocode.oCC=gcc
test:${OBJS} ${CC}-otest${OBJS}
prog.o:prog.cprog.hcode.h ${CC}-cprog.c-oprog.o
code.o:code.ccode.h ${CC}-ccode.c-ocode.o
clean: rm-f*.o273.3.3Makefile中的变量环境变量:使用方法很简单,在make启动时,make读取系统当前已定义的环境变量,并且创建与之同名同值的变量,因此用户可以像在shell中一样在Makefile中方便的引用环境变量。需要注意的是,如果用户在Makefile中定义了同名的变量,用户自定义变量将覆盖同名的环境变量。此外,Makefile中还有一些预定义变量和自动变量,但是看起来并不像自定义变量那样直观。283.4gdb调试工具上面例子,可以简化为:OBJS=prog.ocode.oCC=gcctest:${OBJS} ${CC}-o$@$^prog.o:prog.cprog.hcode.hcode.o:code.ccode.h
clean: rm-f*.o293.4gdb调试工具Linux下的gdb调试器,是一款GNU组织开发并发布的UNIX/Linux下的程序调试工具。虽然它没有图形化的友好界面,但是它强大的功能,足以与很多商业化的集成开发工具相媲美。在进行应用程序的调试之前,要注意的是gdb进行调试的是可执行文件,而不是如“.c”这样的源代码文件。因此,需要先通过gcc编译生成可执行文件才能用gdb进行调试。303.4gdb调试工具命令语法:gdb[选项][可执行程序[core文件|进程ID]]功能:跟踪指定程序的运行,给出它的内部运行状态以协助你定位程序中的错误。你还可以指定一个程序运行错误产生的core文件,或者正在运行的程序进程ID。常用选项:-ccore文件 使用指定core文件检查程序。-h 列出命令行选项的简要介绍。-n 忽略~/.gdbinit文件中指定的执行命令。-q 禁止显示介绍信息和版权信息。-s文件 使用保存在指定文件中的符号表。313.4gdb调试工具启动gdb:要使用gdb调试程序,必须使用-g参数重新编译该程序。此选项用于生成包含符号表和调试信息的可执行文件。程序成功编译以后,就可以使用gdb调试它,注意gdb产生的(gdb)提示符。[root@localhostroot]#gcc-ghello.c-ohello[root@localhostroot]#gdb-qhello……(gdb)启动gdb后,可以使用很多命令。离开gdb:使用quit命令可以离开gdb环境并回到shell提示符。gdb支持很多的命令且能实现不同的功能。部分命令:见P94。323.4gdb调试工具例3.7设计一个程序,要求输入两个整数,判断并输出其中的最小数。步骤1设计编辑源程序代码。[root@localhostroot]#vim3-7.c333.4gdb调试工具步骤2用gcc编译程序。在编译的时候要加上选项“-g”。这样编译出的可执行代码中才包含调试信息,否则之后gdb无法载入该可执行文件。[root@localhostroot]#
gcc3-7.c-o3-7-g步骤3进入gdb调试环境。gdb进行调试的是可执行文件,因此要调试的是3-7而不是3-7.c,输入如下:[root@localhost
root]#gdb3-7回车后就进入了gdb调试模式。343.4gdb调试工具步骤4用gdb调试程序。(1)查看源文件在gdb中输入“l”(list)就可以查看程序源代码,一次显示10行。(2)设置断点在gdb中设置断点命令是“b”(break),后面跟行号或者函数名。(3)查看断点信息用命令“infob”(infobreak)查看断点信息。(4)运行程序输入“r”(run)开始运行程序。(5)查看与设置变量值程序运行到断点处会自动暂停,输入“p变量名”可查看指定变量的值。(6)单步运行在断点处输入“n”(next)或者“s”(step)可单步运行。它们之间的区别在于:若有函数,调用时,“s”会进入该函数,而“n”不会进入该函数。353.4gdb调试工具步骤4用gdb调试程序。(7)继续运行程序在查看完变量或堆栈情况后可以输入“c”(continue)命令恢复程序的正常运行,把剩余的程序执行完,并显示执行结果。(8)退出gdb环境退出gdb环境只要输入“q”(quit)命令,回车后退出gdb环境。3637思考与实验编写一个简单的C语言程序:输出两行文字“Howareyou”,在Linux下编辑、编译、运行。编写一个简单的C语言程序:根据输入的两个整数求平均值并且在终端输出,通过gcc编译器得到它的汇编程序文件。Makfile文件中的每一行是描述文件间依赖关系的make规则。对于下面的Makefile文件:CC=gccOPTIONS=-O3-oOBJECTS=main.o
stack.o
misc.oSOUR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广播电视设备用网络通信模块考核试卷
- 城市垃圾填埋场规划考核试卷
- 文化创意产业的资本运作与市场发展动态考核试卷
- 意外伤害保险在旅游业的风险管理考核试卷
- 乳饮料的无乳糖配方设计与市场潜力考核试卷
- 文具企业产品线规划考核试卷
- 葡萄加工售卖合同范本
- 旅游门票售卖合同范本
- 土建付款合同范本
- 第四季度营销工作重点计划及时间表安排方案
- 2025年幼儿园膳食工作计划
- 《基于二维激光SLAM的AGV导航系统设计》
- 药剂学第9版课件:第一章-绪论
- 《下载-综合布线》课件
- 电化学储能系统测试操作方法
- (高清版)DB43∕T 1588.28-2019 小吃湘菜 第28部分:武冈空饼
- 第六单元 共同面对的全球性问题 知识清单
- 老年病科重点专科建设
- 工程投标文件范本完整版
- 小学二年级开学家长会课件2024-2025学年
- 语文跨学科合作:语文与数学的融合
评论
0/150
提交评论