收藏 分销(赏)

Unix系统下C编程.ppt

上传人:仙人****88 文档编号:14189130 上传时间:2026-07-08 格式:PPT 页数:44 大小:540KB 下载积分:10 金币
下载 相关 举报
Unix系统下C编程.ppt_第1页
第1页 / 共44页
Unix系统下C编程.ppt_第2页
第2页 / 共44页


点击查看更多>>
资源描述
Unix,系统下,C,编程,北京神州数码思特奇信息技术股份有限公司,研究院,示例,C,程序,设有一个文件名为,hello.c,的程序,其内容为:,#include,main(),printf(“Hello,World!n”);,编译和执行步骤,编译,gcc,hello.c,#,生成可执行程序,a.out,,或,gcc,o hello,hello.c,#,生成可执行程序,hello,运行,./,a.out,或,./hello,输出结果,Hello World!,纲 要,编译器,头文件,链接器与库文件,静态库,共享库,功能及用法,为什么要使用编译器?,C,语言源程序需要经过编译和链接这两个过程才能转换成二进制可执行程序。,一般在,Unix,系统中使用的,C,编译器是,cc,(,C Compiler,的缩写)。在各个,Linux,发行版本中广泛使用的,C,编译器名为,gcc,(,GNU cc,)。为了保持与,Unix,系统的兼容,在,Linux,系统中,cc,作为了,gcc,的一个链接。,gcc,的功能,gcc,能将,C/C+,源程序和目标程序编译并调用链接程序,ld,生成可执行文件,如果用户没有给出可执行文件的名字,,gcc,将默认生成一个名为,a.out,的可执行文件。,gcc,的用法,gcc,的一般用法为:,gcc,options,其常用格式为:,gcc,-,c-S-E-s-g,-static-shared-,rdynamic,-,Idir,-,Ldir,-,lmylib,-,Olevel,-x Language-,Dmacro,=,defn,-,Umacro-mmachine-option,-o,out_file,infile,几点说明,gcc,根据源程序的扩展名来决定使用哪一种语言的编译器进行编译工作。,扩展名为“,.c”,的文件被,gcc,认为是,C,语言的源程序文件。例如:,gcc,hello.c,gcc,编译出来的可执行程序默认是,a.out,。,g+,是一个,C+,版本的,gcc,编译器。,g+,要求,C+,语言源程序文件带有扩展名“,.cc”,或“,.C”,。例如:,g+,hello.cc,,,g+,hello.C,参数,-c,:编译后仅输出*,.o,型的目标文件,而不连接生成可执行程序,-S,:编译后仅生成汇编语言文件*,.s,,但不生成目标文件和可执行代码,-s,:生成可执行文件时,删除符号表和重定位信息。生成成品软件时使用,-E,:在预处理过程后结束,不进行编译和连接,也不生成可执行代码,-g,:在可执行文件中加入调试信息,便于程序的调试,参数(续),-o,outfile,:指定输出文件名。若不指定则生成,a.out,-,Idir,:将目录,dir,添加到头文件搜索范围,-,lmylib,:连接时搜索库,libmylib.a,-,Ldir,:将目录,dir,添加到库文件搜索范围,-OL,:编译时进行优化。,L,为优化级别,分别,03,和,s,。生成最终产品时使用,-static,:禁止使用共享库(动态连接库),-shared,:生成共享库,-,rdynamic,:连接时使用共享库,gcc,的常用选项,gcc,常用选项,选项,含义,-c,仅对源文件进行编译,不链接生成可执行文件。在对源文件进行查错时,或只需产生目标文件时可以使用该选项。,-,ggdb,在可执行文件中加入调试信息,方便进行程序的调试。如果使用中括号中的选项,表示加入,gdb,扩展的调试信息,方便使用,gdb,来进行调试,-O0,、,1,、,2,、,3,对生成的代码使用优化,中括号中的部分为优化级别,缺省的情况为,2,级优化,,0,为不进行优化。注意,采用更高级的优化并不一定得到效率更高的代码。,-,D,name,=definition,将名为,name,的宏定义为,definition,,如果中括号中的部分缺省,则宏被定义为,1,gcc,常用选项,选项,含义,-I,dir,在编译源程序时增加一个搜索头文件的额外目录,dir,,即,include,增加一个搜索的额外目录。,-,L,dir,在编译源文件时增加一个搜索库文件的额外目录,dir,-,l,library,在编译链接文件时增加一个额外的库,库名为,library,.a,-w,禁止所有警告,-,W,warning,允许产生,warning,类型的警告,,warning,可以是:,main,、,unused,等很多取值,最常用是,-Wall,,表示产生所有警告。如果,warning,取值为,error,,其含义是将所有警告作为错误(,error,),即出现警告就停止编译。,gcc,的常用选项,c+,程序,一个,c+,版的,Hello World,程序,其文件名为,hello.C,,内容为:,#include,main(void),cout,Hello,World!,endl,;,编译方法,使用,c+,或,g+,来编译:,g+,hello.C,#,生成可执行程序,a.out,c+o hello,hell.C,#,生成可执行程序,hello,g+s-o Hello,hello.C,#,生成删除符号表的可执行程序,Hello,或使用,gcc,并指定库文件来编译,c+,程序:,gcc,c,hello.C,#,生成目标文件,hello.o,gcc,o h,hello.C,lstdc,+,#,指定标准,c+,库,生成可执行程序,h,编译多个文件,greeting.h,#,ifndef,_GREETING_H,#define _GREETING_H,void greeting(char*name);,#,endif,greeting.c,#include,#include,greeting.h,void greeting(char*name),printf(Hello,%,s!rn,name,);,my_app.c,#include,#include,greeting.h,#define N 10,int,main(void,),char,nameN,;,printf(Your,Name,Please,:);,scanf(%s,name,);,greeting(name,);,return 0;,目录结构,(1),编译命令,$,gcc,my_app.c,greeting.c,o,my_app,目录结构,(2),编译方式,(1),$,gcc,my_app.c,functions/,greeting.c,o,my_app,-I function,greeting.h,./,greeting.c,my_app.c,greeting.h,./,greeting.c,my_app.c,functions,编译多个文件,目录结构,(2),编译方式,(2),分步编译,命令:,1,、,$,gcc,-c,my_app.c,-,Ifunctions,2,、,$,gcc,-c,functions/,greeting.c,3,、,$,gcc,my_app.o,greeting.o,o,my_app,思路:,编译每一个,.c,文件,得到,.o,的目标文件;,将每一个,.o,的目标文件链接成一个可执行的文件;,编译多个文件,gcc,的工作过程,使用,gcc/g,+,由,C,源代码文件生成可执行文件的过程,有以下四个阶段,预处理,(,也称预编译,,Preprocessing),编译,(Compilation),汇编,(Assembly),链接,(Linking),头文件,在标准,C,中有两种形式的头文件使用方式:,#include,#include“,headfile.h,”,区别,:,#include,型头文件搜索范围为默认位置,/,usr,/include,,,#,include“headfile.h,”,型头文件的搜索位置为当前目录,在,Linux,的,GNU C,中,若当前目标不存在,headerfile.h,,则也会到默认位置去搜索。,链接器与库文件,UNIX/Linux,的链接器为,ld,,其功能是将目标文件或库文件链接在一起,生成可执行文件,一般在编译过程的最后执行。,Linux,标准库文件一般存放在目录,/lib,或,/,usr,/lib,。默认情况下链接器查找,C,语言的标准库函数。如果使用的不是标准的库函数,必须通过,-,llib,或,-,Llibdir,告诉链接器,ld,,否则将无法找到库函数。,关于库文件的规定,库文件命名必须遵守一定命名规则,库文件名字必须永远以,lib,开头,后紧跟库类名,文件名的后缀为,.a,:传统静态库,.so,:共享库或动态链接库,例如,,libc.a,为标准,C,库,,libm.a,为数学运算静态库,,libc.so.6,和,libm.so.6,分别为标准,C,和数学运算共享库。,静态库,静态库也叫档案,(archive),,以,.a,为后缀,用于编译链接后生成静态可执行文件。用户可以使用库管理程序,ar,和,ranlib,来创建和管理自己的或已有的静态库。,引例,设有,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,main(),fprintf(stderr,”Begine:n,”);,f1(15);,f2(”Hello World!”);,fprintf(stderr,”:Endn,”);,exit(0);,程序举例,编译与链接,可以采用各模块文件分别编译然后再统一链接的办法进,行编译。,cc c f1.c f2.c/,生成,f1.o,和,f2.o,cc o f f3.c f1.o f2.o/,生成,f,cc o,fp,f3.c f1.c f2.c/,生成,fp,cc c f1.c f2.c f3.c/,生成,f1.o,f2.o,和,f3.o,cc o,myp,f1.o f2.o f3.o/,生成,myp,构造和管理静态库,用户可以使用命令,ar,构造自己的静态库:,cc -c f1.c f2.c#,生成目标文件,f1.o,和,f2.o,ar,crv,libmyl.a,f1.o f2.o#,生成库,libmyl.a,ranlib,libmyl.a,#,为子函数建立索引表,说明,ar,用于静态库文件的管理,其功能是库创建、修改和从库中取出模块等,ranlib,用于为刚建立的库文件建立索引表,通过索引表可以加快库文件搜索速度。其用法为:,ranlib,-,vV,ar_file,使用自己的库,#,使用库,libmyl.a,和,f3.c,生成可执行程序,fp,:,cc -o,fp,f3.c,libmyl.a,#,使用库,libmyl.a,和,f3.o,生成可执行程序,fp,:,cc -o,fp,f3.o,libmyl.a,#-L,指定当前目录,,-,lmyl,指定静态库文件,libmyl.a,:,cc -o,fp,f3.c-L.,lmyl,共享库,Linux,系统的另一种库文件为共享库,用于生成动态链接的可执行程序。,共享库文件名的格式为:,libNAME.so.N,NAME,为库名,,N,为版本号。,可用命令,ldd,和,ldconfig,命令管理共享库。,构造共享库,共享库构造非常简单,只需要在构造库的时候使,用,-shared,参数就可以了。,例如,:,用,f1.c,和,f2.c,构造共享库,方法是:,#,生成目标文件,cc-c f1.c f2.c,#,由目标文件生成共享库,cc-shared-o,libmy.so,f1.o f2.o,#,由源文件生成共享库,cc-shared-o,libmy.so,-c f1.c f2.c,共享库的使用,共享库要使用头文件,dlfcn.h,和几个相关的函数:,dlerror,dlopen,dlsym,dlclose,。,1.,dlopen,功能:,用于打开指定共享库,并返回文件描述符。,原型及用法:,void*,dlopen(const,char*filename,int,flag);,返回值:,成功时返回文件描述符,否则返回,NULL,。,dlopen,函数的相关说明,变量,filename,为共享库名。若文件名不以,/,开头,则为非绝对路径名,将按以下顺序搜索库文件:,(1),环境变量中的,LD_LIBRARY_PATH,值指定的路径;,(2),动态链接缓冲文件,/etc/,ld.so.cache,;,(3),库文件默认目录,/lib,,,/,usr,/lib,。,变量,flag,用来表示在什么时候解决未定义的符号,其取值范围与意义如下,:,(1)RTLD_LAZY,:指定在动态链接库的函数执行时解决;,(2)RTLD_NOW,:指定在,dlopen,返回前就解决所有未定义的符号问题。一旦有未解决好未定义的符号,,dlopen,将返回,NULL,表示错误。,注意:,RTLD_LAZY,和,RTLD_NOW,可以与,RTLD_GLOBAL,配合使用,使得那些在以后才加载的库可以获得其中的符号。,2.,dlsym,功能:返回共享中指定函数的入口地址,原型及用法:,void*,dlsym(void,*handle,char*symbol);,说明:,dlsym,根据共享库文件描述符,(handle),与符号,(symbol),,返回,symbol,对应的(函数)入口地址,相当于返回一个,(,函数,),指针。,3.,dlclose,功能:,关闭已经打开的指定共享库文件,此操作应在共享库相关操作完成之后进行。,原型及用法:,int,dlclose,(void*handle);,4.,dlerror,功能:,返回动态共享库操作状态信息。当共享库操作函数执行失败时,,dlerror,可以返回出错信息,否则返回值为,NULL,表示成功。,原型及用法为:,const char*,dlerror(void,);,共享库使用示例,为了使用刚创建的共享库,需要对引例中的模块文件,f3.c,进行修改。假定修改后的文件被命名为,f3n.c,,其代码如下:,#include,#include,#define SO_FILE./,libmy.so,main(),void*,sfp,;char*err;,int,tmpi,=16;,int,(*f1)(int),(*f2)(char*);/,定义函数指针,sfp,=,dlopen(SO_FILE,,,RTLD_LAZY);/,打开共享库,if(sfp,=NULL),fprintf(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);/,调用函数,f2,f1(tmpi);/,调用函数,f1,fprintf(stderr,+end+n,);,dlclose(sfp,);/,关闭共享库,exit(0);,共享库使用示例,编译方法,编译方法为:,cc o,myp,f3n.c,ldl,由共享库,libmy.so,生成可执行程序,myp,,,-,ldl,则指示链接程序,ld,使用,dl,函数库。,在编译时也可以使用,-,rdynamic,参数,告诉链接程序在链接时所有函数均使用共享库。,其方法为:,cc,rdynamic,o,myp,f3n.c,ldl,共享库的管理,ldd,(2),ldconfig,(1),ldd,功能:,ldd(Library,Dependency Display),用来显示一个可执行程序或共享库所使用的共享库间的依赖关系。,例如:,ldd,myp,ldd,/,usr/bin/mesg,(2)ldconfig,功能:,在默认目录,(/lib,和,/,usr,/lib),或动态库配置文件,/etc/,ld.so.conf,内所列的目录下或指定目录下搜索共享库,进而创建出动态装入程序,ld.so,所需的链接和缓存文件。,缓存文件默认为,/etc/,ld.so.cache,,其中保存有已排好序的由,/etc/,ld.so.conf,指定的目录内动态链接库名字列表。,为了让系统或用户动态链接库为系统所共享,需要运行,ldconfig,来对共享库进行配置。,ldconfig,通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。,用法为:,ldconfig,选项,ldconfig,的使用示例,1),显示搜索的目录和共享库,并更新缓存文件,/etc/,ld.so.cache,ldconfig,-v,默认情况下,,ldconfig,不输出任何东西。使用,-v,参数可以显示正在扫描的目录及搜索到的共享库。,2),安装共享后,更新目录,/lib,内的符号链接,ldconfig,n/lib,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服