第四讲LINUX系统的C编程.ppt

上传人:sccc 文档编号:5296556 上传时间:2023-06-23 格式:PPT 页数:69 大小:607.02KB
返回 下载 相关 举报
第四讲LINUX系统的C编程.ppt_第1页
第1页 / 共69页
第四讲LINUX系统的C编程.ppt_第2页
第2页 / 共69页
第四讲LINUX系统的C编程.ppt_第3页
第3页 / 共69页
第四讲LINUX系统的C编程.ppt_第4页
第4页 / 共69页
第四讲LINUX系统的C编程.ppt_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《第四讲LINUX系统的C编程.ppt》由会员分享,可在线阅读,更多相关《第四讲LINUX系统的C编程.ppt(69页珍藏版)》请在三一办公上搜索。

1、第四讲 Linux系统的C编程,主要内容,编译器及工作过程链接器与库文件静态库的构造及使用共享库的构造及使用make命令与Makefile调试器与程序调试其它编程工具简介,第四讲 Linux系统的C编程,4.1 编译器 4.2头文件 4.3链接器与库文件 4.4 静态库 4.5 共享库 4.6 make与Makefile 4.7 调试器gdb 4.8 UNIX/Linux其它编程工具简介,4.1 编译器,4.1.1 功能及用法 4.1.2 参数及说明4.1.3 示例4.1.4 gcc的工作过程,4.1.1 功能及用法,1.为什么要使用编译器?C语言源程序需要经过编译和链接这两个过程才能转换成二

2、进制可执行程序。一般在Unix系统中使用的C编译器是cc(C Compiler的缩写)。在各个Linux发行版本中广泛使用的C编译器名为gcc(GNU cc)。,2.功能gcc能将C/C+源程序和目标程序编译并调用链接程序ld生成可执行文件,如果用户没有给出可执行文件的名字,gcc将默认生成一个名为a.out的可执行文件。,4.1.1 功能及用法,3.用法gcc的一般用法为:gcc options 其常用格式为:gcc-c-S-E-s-g-static-shared-rdynamic-Idir-Ldir-lmylib-x Language-Olevel-Dmacro=defn-Umacro-m

3、machine-option-o out_file infile,几点说明,gcc根据源程序的后缀名来决定使用哪一种语言的编译器进行编译工作。后缀名为“.c”(小写)的文件被gcc认为是C语言的源程序文件。例如:gcc hello.cgcc编译出来的可执行程序默认是a.out。,几点说明(续),g+是一个C+版本的gcc编译器。g+要求C+语言源程序文件带有后缀名“.cc”。例如:g+hello.cc,4.1.2 参数及说明,4.1.2 参数及说明(续),4.1.3 示例,C程序 设有一个文件名为hello.c的程序,其内容为:,执行步骤,编译可按以下方法进行编译,以生成相应的结果:gcc h

4、ello.c#生成可执行程序a.out或gcc o hello hello.c#生成可执行程序hello运行编译生成可执行文件之后,就可以运行了,方法为:./a.out或./hello 输出结果 Hello World!,2.c+程序下面是一个c+版的Hello World程序,其文件名为hello.C,内容为:,编译方法,使用c+或g+来编译:g+hello.C#生成可执行程序a.outc+o hello hell.C#生成可执行程序hellog+s-o Hello hello.C#生成删除符号表的可执行程序Hello 或使用gcc并指定库文件来编译c+程序:gcc c hello.C#生成

5、目标文件hello.ogcc o h hello.C lstdc+#指定标准c+库,生成可执行程序h,4.1.4 gcc的工作过程,使用gcc/g+由C源代码文件生成可执行文件的过程,有以下四个阶段预处理(也称预编译,Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking),4.2 头文件,在标准C中有两种形式的头文件使用方式:#include#include“headfile.h”区别:#include 型头文件搜索范围为默认位置/usr/include,#include“headfile.h”型头文件的搜索位置为当前目录,在Linux的GNU

6、 C中,若当前目标不存在headfile.h,则也会到默认位置去搜索。,4.3 链接器与库文件,UNIX/Linux的链接器为ld,其功能是将目标文件或库文件链接在一起,生成可执行文件,一般在编译过程的最后执行。Linux标准库文件一般存放在目录/lib或/usr/lib。默认情况下链接器查找C语言的标准库函数。如果使用的不是标准的库函数,必须通过-llib或-Llibdir告诉链接器ld,否则将无法找到库函数。,库文件命名必须遵守一定命名规则,库文件名字必须永远以lib开头,后紧跟库类名,文件名的后缀为.a:传统静态库.so:共享库或动态链接库例如,libc.a为标准C库,libm.a为数学

7、运算静态库,libc.so.6 和libm.so.6分别为标准C和数学运算共享库。,4.4 静态库,静态库也叫档案(archive),以.a为后缀,用于编译链接后生成静态可执行文件。用户可以使用库管理程序ar和ranlib来创建和管理自己的或已有的静态库。,4.4.1 引例设有C语言文件f1.c,f2.c,f3.c,它们的内容分别为:,/文件f1.c的内容f1(int arg)printf(”F1:you passed:%dn”,arg);/文件f2.c的内容:f2(char*arg)printf(”F2:you passed:%sn”,arg);/文件f3.c的内容:#include,mai

8、n()fprintf(stderr,”Begin:n”);f1(15);f2(”Hello World!”);fprintf(stderr,”:Endn”);exit(0);,可以采用各模块文件分别编译然后再统一链接的办法进行编译。cc c f1.c f2.c/生成f1.o和f2.occ o f f3.c f1.o f2.o/生成fcc o fp f3.c f1.c f2.c/生成fp,4.4.2 构造和管理静态库,用户可以使用命令ar构造自己的静态库:cc c f1.c f2.c/生成目标文件f1.o和f2.oar crv libmyl.a f1.o f2.o/生成库libmyl.aranl

9、ib libmyl.a/为子函数建立索引表,说明,ar用于静态库文件的管理,其功能是库创建、修改和从库中取出模块等 ranlib用于为刚建立的库文件建立索引表,通过索引表可以加快库文件搜索速度。其用法为:ranlib-vV ar_file,4.4.3 使用自己的库,当用户创建自己的静态库之后,就可以按照使用系统库的方法来使用它。例如:cc o fp f3.c libmyl.a#使用库libmyl.a和f3.c生成可执行程序fpcc o fp f3.o libmyl.a#使用库libmyl.a和f3.o生成可执行程序fpcc o fp f3.c-L.lmyl#-L指定当前目录,-lmyl指定静态

10、库文件libmyl.a,4.5 共享库,Linux系统的另一种库文件为共享库,用于生成动态链接的可执行程序。共享库文件名的格式为:libNAME.so.NNAME为库名,N为版本号。可用命令ldd和ldconfig命令管理共享库。,4.5.1 构造共享库,Linux的共享库用于生成动态链接的可执行程序。共享库文件名的格式为:libNAME.so.NNAME为库名,N为版本号。常用命令ldd和ldconfig命令管理共享库。,4.5.1 构造共享库,共享库构造非常简单,只需要在构造库的时候使用-shared参数就可以了。例如:用4.4.1引例中的f1.c和f2.c构造共享库,方法是:cc-c f

11、1.c f2.c/生成目标文件cc-shared-o libmy.so f1.o f2.o/由目标文件生成共享库或cc-shared o libmy.so c f1.c f2.c/由源文件生成共享库,4.5.2 共享库的使用,共享库要使用头文件dlfcn.h和几个相关的函数:dlerror,dlopen,dlsym和dlclose。1.dlopendlopen用于打开指定共享库,并返回文件描述符。其原型为:void*dlopen(const char*filename,int flag);dlopen调用失败时返回NULL值,否则返回文件描述符。,Dlopen函数的相关说明,变量filenam

12、e为共享库名。若文件名不以/开头,则为非绝对路径名,将按以下顺序搜索库文件:(1)环境变量中的LD_LIBRARY_PATH值指定的路径;(2)动态链接缓冲文件/etc/ld.so.cache;(3)库文件默认目录/lib,/usr/lib。,Dlopen函数的相关说明,变量flag用来表示在什么时候解决未定义的符号,其取值范围与意义如下(1)RTLD_LAZY:指定在动态链接库的函数执行时解决;(2)RTLD_NOW:指定在dlopen返回前就解决所有未定义的符号问题。一旦有未解决好未定义的符号,dlopen将返回NULL表示错误。注意:RTLD_LAZY和RTLD_NOW可以与RTLD_G

13、LOBAL配合使用,使得那些在以后才加载的库可以获得其中的符号。,2.dlsymdlsym用于返回共享中指定函数的入口地址其原型为:void*dlsym(void*handle,char*symbol);dlsym根据共享库文件描述符(handle)与符号(symbol),返回symbol对应的(函数)入口地址,相当于返回一个(函数)指针。,3.dlclosedlclose用于关闭已经打开的指定共享库文件,此操作应在共享库相关操作完成之后进行。其原型为:int dlclose(void*handle);,4.dlerror函数dlerror()用于返回动态共享库操作状态信息。当共享库操作函数执

14、行失败时,dlerror可以返回出错信息,否则返回值为NULL表示成功。其原型为:const char*dlerror(void);,5.共享库使用示例,为了使用刚创建的共享库,需要对4.4.1引例中的模块文件f3.c进行修改。假定修改后的文件被命名为f3n.c,其代码如下:,#include#include#define SO_FILE./libmy.somain()void*sfp;char*err;inttmpi=16;int(*f1)(int),(*f2)(char*);/定义函数指针sfp=dlopen(SO_FILE,RTLD_LAZY);/打开共享库if(sfp=NULL)fpr

15、intf(stderr,dlerror();exit(1);f1=dlsym(sfp,f1);/获取函数f1入口地址(指针),err=dlerror();/检查是否成功if(err)fprintf(stderr,err);exit(2);f2=dlsym(sfp,f2);/获取函数f2入口地址(指针)err=dlerror();/检查是否成功if(err)fprintf(stderr,err);exit(3);fprintf(stderr,-begine-n);f2(Test String);/调用函数f2f1(tmpi);/调用函数f1fprintf(stderr,+end+n);dlclo

16、se(sfp);/关闭共享库exit(0);,编译方法为:cc o myp f3n.c ldl 由共享库libmy.so生成可执行程序myp,-ldl则指示链接程序ld使用dl函数库。在编译也可以使用-rdynamic参数,告诉链接程序在链接时所有函数均使用共享库。其方法为:cc rdynamic o myp f3n.c ldl,6.共享库的管理,(1)lddldd(Library Dependency Display)用来显示一个可执行程序或共享库所使用的共享库间的依赖关系。例如:#ldd myp#ldd/usr/bin/mesg,(2)ldconfigldconfig为共享管理程序,其功能

17、是在默认目录(/lib和/usr/lib)或动态库配置文件/etc/ld.so.conf内所列的目录下或指定目录下搜索共享库,进而创建出动态装入程序ld.so所需的链接和缓存文件。缓存文件默认为/etc/ld.so.cache,其中保存有已排好序的由/etc/ld.so.conf指定的目录内动态链接库名字列表。为了让系统或用户动态链接库为系统所共享,需要运行ldconfig来对共享库进行配置。ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令,其用法为:ldconfig 选项,ldconfig的使用示例如下:,1)显示搜索的目录和共享库,并更新缓存

18、文件/etc/ld.so.cache ldconfig-v 默认情况下,ldconfig不输出任何东西。使用-v参数可以显示正在扫描的目录及搜索到的共享库。2)安装共享后,更新目录/lib内的符号链接 ldconfig n/lib,4.6 make与Makefile,4.6.1 make的用法简介4.6.2 Makefile文件4.6.3 make的用法简介4.6.4 Makefile示例,4.6.1 make的用法简介,make命令会根据Makefile的内容对项目进行管理。make能自动确定哪一个模块被修改了,然后再进行统一、无遗漏的编译。make的用法为:make-f filename

19、options targets,make命令的部分参数列表如下:,4.6.2 Makefile文件,Makefile文件的内容是描述项目或软件中的模块之间的相互依赖关系以及目标文件、可执行程序产生时要执行的命令等。,(1)Makefile文件包含的5类内容,规则的定义,规则中的项目定义必须从最左边开始,一个规则中的第二行以后的行必须以tab健开始。规则的格式如下:targets:prerequisites commands或targets:prerequisites;commands commands,(2)Makefile文件中的常用符号,Makefile文件中的符号“%”,可使用符号“%”

20、定义或重定义模式规则。例如:%.o:%.c cc c$上述语句定义了一个规则:所有目标文件*.o依赖C语言源程序*.c,且生成方法为cc-c$。,Makefile文件中的符号“=”或“:=”,符号“=”或“:=”用于修改已经定义的变量或在已定义变量的基础上定义新变量。例如已知:var1=a.c b.c c.c则var2=$(var1:.c=.o)定义var2=a.o b.o c.o而var1+=d.c重定义var1,其值为var1=a.c b.c c.c d.c,注意,“:=”与“=”是有区别的。当使用“=”时,变量将做递归或扩展“:=”只作简单替换。,4.6.3 make的用法简介,Make

21、file文件内容可包含多个目标,可以通过make obj的方式指定处理的目标,若不指定则默认为第一个。为了方便的使用Makefile文件对整个项目进行编译,可在Makefile文件内设一个代表整个项目的目标,一般为all。,有时为了对项目进行管理还要设置有clean、install和uninstall目标:clean用于对项目环境进行准备,清除已经生成的目标文件等以便重新编译;install用于对整个项目的成品进行安装;uninstall则是用于对安装的项目进行卸载。,4.6.4 Makefile示例,1.多模块项目编译示例在4.4.1引例中有三个模块,它们分别是f1.c,f2.c和f3.c,

22、它们之间的关系如下图,按照gcc的工作过程,对模块的编译和链接过程可分为:,(1)编译各源文件生成目标代码:gcc c f1.cgcc c f2.cgcc c f3.c(2)生成可执行程序gcc-o f f1.o f2.o f3.o,上述过程按照Makefile文件的规定可表示为:f:f1.o f2.o f3.o#f依赖于目标文件f1.o,f2.o和f3.o,其生成过程为:gcc-o f f1.o f2.o f3.of1.o:f1.c#f1.o依赖于f1.c,生成过程为:gcc c f1.cf2.o:f2.c#f2.o依赖于f2.c,生成过程为:gcc c f2.cf3.o:f3.c#f3.o

23、依赖于f3.c,生成过程为:gcc c f3.c,按照Makefile的格式要求,可以构造此项目的Makefile内容为:,有了Makefile文件,可以使用make命令对此项目进行编译。编译方法为:make或 make f若要编译单个项目,比方说f1.o,可以使用以下方法:make f1.o,当为Makefile文件增加all、clean和install目标时,Makefile文件可以变为:,2.多模块项目共享库编译与使用示例,4.5.1共享库创建和4.5.2共享库使用的Makefile文件可分别由so.mk和so.use来实现。,so.mk的内容如下:,so.use的内容如下:,生成目标文

24、件可使用命令make all f so.mk必要时可先运行 make clean-f so.mk使用共享库编译可使用命令make all-f so.use,4.7 调试器gdb,4.7.1 gdb功能 监视或修改程序中变量的值设置断点以使程序在指定的代码行上暂停执行单步执行或程序跟踪,4.7.2 gdb 基本命令,4.7.3 程序调试方法,下面以4.4.1引例为例,介绍Linux系统内程序调试的基本方法。1.编译时使用调试参数-gcc g o myp f1.c f2.c f3.c2.启动gdbgdb myp3.查看源文件(gdb)list,4.设置断点(gdb)break 6Breakpoin

25、t 1*file f3.c,line 65.开始执行(gdb)runBreakpoint 1,main()at f3.c:66f2(Test String);6.打印变量的值(gdb)print tmpi$1=16,7.单步执行,跟踪进入函数f1(也使用next命令执行f1,而不进入函数f1)(gdb)stepf1(arg=16)at f1.c:33 printf(”F1:you passed%dn”,arg);8.显示f1()变量arg的值(gdb)print arg$2 arg=169.可在任何位置使用where命令,显示程序的调用栈,而得到自己位置。方法是:(gdb)where,10.列当前文件的内容(gdb)list11.程序继续执行直到程序结束(gdb)continue,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号