Unix系统下C编程ppt课件_第1页
Unix系统下C编程ppt课件_第2页
Unix系统下C编程ppt课件_第3页
Unix系统下C编程ppt课件_第4页
Unix系统下C编程ppt课件_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

1、www.si-Unix系统下系统下C 编程编程北京神州数码思特奇信息技术股份北京神州数码思特奇信息技术股份研讨院研讨院例如例如C程序程序 设有一个文件名为设有一个文件名为hello.c的程序,其内容为:的程序,其内容为:#includemain()printf(“Hello World!n”);编译和执行步骤编译和执行步骤编译编译 gcc hello.c #生成可执行程序生成可执行程序a.out,或,或gcc o hello hello.c #生成可执行程序生成可执行程序hello运转运转 ./a.out或或 ./hello 输出结果输出结果 Hello World! 纲纲 要要 编译器编译器

2、 头文件头文件 链接器与库文件链接器与库文件 静态库静态库 共享库共享库 功能及用法功能及用法 为什么要运用编译器?为什么要运用编译器?C言语源程序需求经过编译和链接这两个过程才干转换成言语源程序需求经过编译和链接这两个过程才干转换成二进制可执行程序。二进制可执行程序。普通在普通在Unix系统中运用的系统中运用的C编译器是编译器是ccC Compiler的的缩写。在各个缩写。在各个Linux发行版本中广泛运用的发行版本中广泛运用的C编译器编译器名为名为gccGNU cc。为了坚持与。为了坚持与Unix系统的兼容,系统的兼容,在在Linux系统中系统中cc作为了作为了gcc的一个链接。的一个链接

3、。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-mma

4、chine-option -o out_file infile 几点阐明几点阐明gcc根据源程序的扩展名来决议运用哪一种言语的编译器进展编译根据源程序的扩展名来决议运用哪一种言语的编译器进展编译任务。任务。扩展名为扩展名为“.c的文件被的文件被gcc以为是以为是C言语的源程序文件。例如:言语的源程序文件。例如:gcc hello.cgcc编译出来的可执行程序默许是编译出来的可执行程序默许是a.out。g+是一个是一个C+版本的版本的gcc编译器。编译器。g+要求要求C+言语源程序文件带有扩展名言语源程序文件带有扩展名“或或“.C。例如:。例如:g+ hello, g+ hello.C参数参数

5、-c:编译后仅输出:编译后仅输出*.o型的目的文件,而不衔接生成可执型的目的文件,而不衔接生成可执行程序行程序 -S:编译后仅生成汇编言语文件:编译后仅生成汇编言语文件*.s,但不生成目的文件,但不生成目的文件和可执行代码和可执行代码 -s:生成可执行文件时,删除符号表和重定位信息。生:生成可执行文件时,删除符号表和重定位信息。生成废品软件时运用成废品软件时运用 -E:在预处置过程后终了,不进展编译和衔接,也不生:在预处置过程后终了,不进展编译和衔接,也不生成可执行代码成可执行代码 -g:在可执行文件中参与调试信息,便于程序的调试:在可执行文件中参与调试信息,便于程序的调试参数续参数续-o o

6、utfile:指定输出文件名。假设不指定那么生成:指定输出文件名。假设不指定那么生成a.out-Idir:将目录:将目录dir添加到头文件搜索范围添加到头文件搜索范围-lmylib:衔接时搜索库:衔接时搜索库libmylib.a-Ldir:将目录:将目录dir添加到库文件搜索范围添加到库文件搜索范围-OL:编译时进展优化。:编译时进展优化。L为优化级别,分别为优化级别,分别03和和s。生成最终产品。生成最终产品时运用时运用-static:制止运用共享库动态衔接库:制止运用共享库动态衔接库-shared:生成共享库:生成共享库-rdynamic:衔接时运用共享库:衔接时运用共享库gcc的常用选项

7、的常用选项gcc常用选项常用选项选项选项含义含义-c仅对源文件进行编译,不链接生成可执行文件。在对源文件进行仅对源文件进行编译,不链接生成可执行文件。在对源文件进行查错时,或只需产生目标文件时可以使用该选项。查错时,或只需产生目标文件时可以使用该选项。-ggdb在可执行文件中加入调试信息,方便进行程序的调试。如果使用在可执行文件中加入调试信息,方便进行程序的调试。如果使用中括号中的选项,表示加入中括号中的选项,表示加入gdb扩展的调试信息,方便使用扩展的调试信息,方便使用gdb来来进行调试进行调试-O0、1、2、3对生成的代码使用优化,中括号中的部分为优化级别,缺省的情对生成的代码使用优化,中

8、括号中的部分为优化级别,缺省的情况为况为2级优化,级优化,0为不进行优化。注意,采用更高级的优化并不一为不进行优化。注意,采用更高级的优化并不一定得到效率更高的代码。定得到效率更高的代码。-Dname=definition将名为将名为name的宏定义为的宏定义为definition,如果中括号中的部分缺省,则,如果中括号中的部分缺省,则宏被定义为宏被定义为1gccgcc常用选项常用选项选项选项含义含义-I -I dirdir在编译源程序时增加一个搜索头文件的额外目录在编译源程序时增加一个搜索头文件的额外目录dirdir,即,即includeinclude增加一个搜索的额外目录。增加一个搜索的额

9、外目录。-L-Ldirdir在编译源文件时增加一个搜索库文件的额外目录在编译源文件时增加一个搜索库文件的额外目录dirdir-l-llibrarylibrary在编译链接文件时增加一个额外的库,库名为在编译链接文件时增加一个额外的库,库名为librarylibrary.a.a-w-w禁止所有警告禁止所有警告-W-Wwarningwarning允许产生允许产生warningwarning类型的警告,类型的警告,warningwarning可以是:可以是:mainmain、unusedunused等等很多取值,最常用是很多取值,最常用是-Wall-Wall,表示产生所有警告。如果,表示产生所有警告

10、。如果warningwarning取取值为值为errorerror,其含义是将所有警告作为错误(,其含义是将所有警告作为错误(errorerror),即出现警),即出现警告就停止编译。告就停止编译。gcc的常用选项的常用选项c+程序程序一个一个c+版的版的Hello World程序,其文件名为程序,其文件名为hello.C,内容为:,内容为:#include main (void)cout Hello, World! endl;编译方法编译方法运用运用c+或或g+来编译:来编译:g+ hello.C#生成可执行程序生成可执行程序a.outc+ o hello hell.C #生成可执行程序生成

11、可执行程序hellog+ s -o Hello hello.C#生成删除符号表的可执行程序生成删除符号表的可执行程序Hello 或运用或运用gcc并指定库文件来编译并指定库文件来编译c+程序:程序:gcc c hello.C #生成目的文件生成目的文件hello.ogcc o h hello.C lstdc+ #指定规范指定规范c+库,生成可执行程序库,生成可执行程序h编译多个文件编译多个文件greeting.h #ifndef _GREETING_H #define _GREETING_Hvoid greeting (char * name);#endif greeting.c #inclu

12、de #include greeting.hvoid greeting (char * name)printf(Hello %s!rn,name); my_app.c #include #include greeting.h#define N 10int main(void)char nameN; printf(Your Name,Please:); scanf(%s,name); greeting(name); return 0; 目录构造目录构造(1)(1)编译命令编译命令$ gcc my_app.c greeting.c o my_app$ gcc my_app.c greeting.c

13、 o my_app目录构造目录构造(2)(2)编译方式编译方式(1)(1)$ $gcc my_app.c functions/greeting.c o my_app -I gcc my_app.c functions/greeting.c o my_app -I function function greeting.h./greeting.cmy_app.cgreeting.h./greeting.cmy_app.cfunctions编译多个文件编译多个文件目录构造目录构造(2)编译方式编译方式(2)分步编译分步编译命令:命令:1、$gcc -c my_app.c -Ifunctions 2、

14、$gcc -c functions/greeting.c3、$gcc my_app.o greeting.o o my_app思绪:思绪:编译每一个编译每一个.c文件,得到文件,得到.o的目的文件;的目的文件;将每一个将每一个.o的目的文件链接成一个可执行的文件;的目的文件链接成一个可执行的文件;编译多个文件编译多个文件gcc的任务过程的任务过程运用运用gcc/g+由由C源代码文件生成可执行文件的过程,有以下四个源代码文件生成可执行文件的过程,有以下四个阶段阶段 预处置预处置(也称预编译,也称预编译,Preprocessing)编译编译(Compilation)汇编汇编(Assembly)链接

15、链接(Linking) 头文件头文件 在规范在规范C中有两种方式的头文件运用方式:中有两种方式的头文件运用方式:#include#include“headfile.h区别区别:#include 型头文件搜索范围为默许位置型头文件搜索范围为默许位置/usr/include,#include“headfile.h型头文件的搜索位置为当前目录,在型头文件的搜索位置为当前目录,在Linux的的GNU C中,假设当前目的不存在中,假设当前目的不存在headerfile.h,那么也会到默许位置,那么也会到默许位置去搜索。去搜索。 链接器与库文件链接器与库文件UNIX/Linux的链接器为的链接器为ld,其

16、功能是将目的文件或库文件链接在,其功能是将目的文件或库文件链接在一同,生成可执行文件,普通在编译过程的最后执行。一同,生成可执行文件,普通在编译过程的最后执行。Linux规范库文件普通存放在目录规范库文件普通存放在目录/lib或或/usr/lib。默许情况下链接。默许情况下链接器查找器查找C言语的规范库函数。假设运用的不是规范的库函数,必言语的规范库函数。假设运用的不是规范的库函数,必需经过需经过-llib或或-Llibdir通知链接器通知链接器ld,否那么将无法找到库函数。,否那么将无法找到库函数。 关于库文件的规定关于库文件的规定 库文件命名必需遵守一定命名规那么,库文件名字必需库文件命名

17、必需遵守一定命名规那么,库文件名字必需永远以永远以lib开头,后紧跟库类名,文件名的后缀为开头,后紧跟库类名,文件名的后缀为 .a:传统静态库:传统静态库 .so:共享库或动态链接库:共享库或动态链接库 例如,例如,libc.a为规范为规范C库,库,libm.a为数学运算静态库,为数学运算静态库,libc.so.6和和libm.so.6分别为规范分别为规范C和数学运算共享库。和数学运算共享库。静态库静态库 静态库也叫档案静态库也叫档案(archive),以,以.a为后缀,用于编译链为后缀,用于编译链接后生成静态可执行文件。用户可以运用库管理程序接后生成静态可执行文件。用户可以运用库管理程序ar

18、和和ranlib来创建和管理本人的或已有的静态库。来创建和管理本人的或已有的静态库。 引例引例设有设有C C言语文件言语文件f1.cf1.c,f2.cf2.c,f3.cf3.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(Hell

19、o 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/生成生成fpcc c f1.c f2.c f3.c/生成生成f1.o,f2.o和和f3.occ o myp f1.o f2.o f3.o/生成生成myp构造和管理静态库构造和管理静态库 用户可以运用命令用户可

20、以运用命令ar构造本人的静态库:构造本人的静态库:cc -c f1.c f2.c#生成目的文件生成目的文件f1.o和和f2.oar crv libmyl.a f1.o f2.o#生成库生成库libmyl.aranlib libmyl.a#为子函数建立索为子函数建立索引表引表阐明阐明ar用于静态库文件的管理,其功能是库创建、修正和从库中取出用于静态库文件的管理,其功能是库创建、修正和从库中取出模块等模块等 ranlib用于为刚建立的库文件建立索引表,经过索引表可以加快用于为刚建立的库文件建立索引表,经过索引表可以加快库文件搜索速度。其用法为:库文件搜索速度。其用法为:ranlib -vV ar_

21、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系统的另一种库文件为共享库,用于生成动态链接的可执行系统的另一种库文件为共享库,用于生成动态链接的可执行程序。程序。共享库文件名的格式为:共享库文件名的格式为: lib

22、NAME.so.NNAME为库名,为库名,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

23、 -o libmy.so -c f1.c f2.c共享库的运用共享库的运用 共享库要运用头文件共享库要运用头文件dlfcn.h和几个相关的函数:和几个相关的函数:dlerrordlopendlsymdlclose。1. dlopen功能:功能:用于翻开指定共享库,并前往文件描画符。用于翻开指定共享库,并前往文件描画符。原型及用法:原型及用法:void *dlopen(const char *filename, int flag);前往值:前往值:胜利时前往文件描画符,否那么前往胜利时前往文件描画符,否那么前往NULL。dlopen函数的相关阐明函数的相关阐明变量变量filename为共享库名。

24、假设文件名不以为共享库名。假设文件名不以/开头,那么为非绝对途开头,那么为非绝对途径名,将按以下顺序搜索库文件:径名,将按以下顺序搜索库文件:(1)环境变量中的环境变量中的LD_LIBRARY_PATH值指定的途径;值指定的途径;(2)动态链接缓冲文件动态链接缓冲文件/etc/ld.so.cache;(3)库文件默许目录库文件默许目录/lib,/usr/lib。 变量变量flag用来表示在什么时候处理未定义的符号,其取值范围与意用来表示在什么时候处理未定义的符号,其取值范围与意义如下义如下:(1)RTLD_LAZY:指定在动态链接库的函数执行时处理;:指定在动态链接库的函数执行时处理;(2)R

25、TLD_NOW:指定在:指定在dlopen前往前就处理一切未定义的符号问前往前就处理一切未定义的符号问题。一旦有未处理好未定义的符号,题。一旦有未处理好未定义的符号,dlopen将前往将前往NULL表示错误表示错误。留意:留意:RTLD_LAZY和和RTLD_NOW可以与可以与RTLD_GLOBAL配合运配合运用,使得那些在以后才加载的库可以获得其中的符号。用,使得那些在以后才加载的库可以获得其中的符号。2. dlsym功能:前往共享中指定函数的入口地址功能:前往共享中指定函数的入口地址原型及用法:原型及用法:void *dlsym(void *handle, char *symbol);阐明

26、:阐明:dlsym根据共享库文件描画符根据共享库文件描画符(handle)与符号与符号(symbol),前往,前往symbol对应的函数入口地址,相当于前往一个对应的函数入口地址,相当于前往一个(函数函数)指针。指针。 3. dlclose功能:功能:封锁曾经翻开的指定共享库文件,此操作应在共享库相关操作完成封锁曾经翻开的指定共享库文件,此操作应在共享库相关操作完成之后进展。之后进展。原型及用法:原型及用法:int dlclose (void *handle);4. dlerror 功能:功能: 前往动态共享库操作形状信息。当共享库操作函数执行前往动态共享库操作形状信息。当共享库操作函数执行失

27、败时,失败时,dlerror可以前往出错信息,否那么前往值为可以前往出错信息,否那么前往值为NULL表示胜利。表示胜利。 原型及用法为:原型及用法为: const char *dlerror(void); 共享库运用例如共享库运用例如 为了运用刚创建的共享库,需求对引例中的模块文件为了运用刚创建的共享库,需求对引例中的模块文件f3.c进展修正。假定修正后的文件被命名为进展修正。假定修正后的文件被命名为f3n.c,其代,其代码如下:码如下: #include #include #define SO_FILE ./libmy.somain()void *sfp; char *err;inttmpi

28、=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=dl

29、error(); /检查能否胜利检查能否胜利if(err) fprintf(stderr,err); exit(3); fprintf(stderr,-begine-n);f2(Test String); /调用函数调用函数f2f1(tmpi); /调用函数调用函数f1fprintf(stderr,+end+n);dlclose(sfp); /封锁共享库封锁共享库exit(0); 共享库运用例如共享库运用例如编译方法编译方法编译方法为:编译方法为:cc o myp f3n.c ldl 由共享库由共享库libmy.so生成可执行程序生成可执行程序myp,-ldl那么指示链接程序那么指示链接程序l

温馨提示

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

评论

0/150

提交评论