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

下载本文档

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

文档简介

1、www.si-unix系统下系统下c 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编译器是编译器是cc(c compiler的缩写)。的缩写)。在各个在各个linux发行版本中广泛使用的发行版本中广泛使用的c编译器名为编译器名为gcc(gnu cc)。为了保持与)。为了保持与unix系统的兼容,在系统的兼容,在linux系统中系统中cc作为了

3、作为了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 -dmacr

4、o=defn -umacro-mmachine-option -o out_file infile 几点说明几点说明gcc根据源程序的扩展名来决定使用哪一种语言的编译器进行编译根据源程序的扩展名来决定使用哪一种语言的编译器进行编译工作。工作。扩展名为扩展名为“.c”的文件被的文件被gcc认为是认为是c语言的源程序文件。例如:语言的源程序文件。例如:gcc hello.cgcc编译出来的可执行程序默认是编译出来的可执行程序默认是a.out。g+是一个是一个c+版本的版本的gcc编译器。编译器。g+要求要求c+语言源程序文件带有扩展名语言源程序文件带有扩展名“.cc”或或“.c”。例如:。例如:g

5、+ hello.cc, g+ hello.c参数参数 -c:编译后仅输出:编译后仅输出*.o型的目标文件,而不连接生成可执型的目标文件,而不连接生成可执行程序行程序 -s:编译后仅生成汇编语言文件:编译后仅生成汇编语言文件*.s,但不生成目标文件,但不生成目标文件和可执行代码和可执行代码 -s:生成可执行文件时,删除符号表和重定位信息。生:生成可执行文件时,删除符号表和重定位信息。生成成品软件时使用成成品软件时使用 -e:在预处理过程后结束,不进行编译和连接,也不生:在预处理过程后结束,不进行编译和连接,也不生成可执行代码成可执行代码 -g:在可执行文件中加入调试信息,便于程序的调试:在可执行

6、文件中加入调试信息,便于程序的调试参数(续)参数(续)-o outfile:指定输出文件名。若不指定则生成:指定输出文件名。若不指定则生成a.out-idir:将目录:将目录dir添加到头文件搜索范围添加到头文件搜索范围-lmylib:连接时搜索库:连接时搜索库libmylib.a-ldir:将目录:将目录dir添加到库文件搜索范围添加到库文件搜索范围-ol:编译时进行优化。:编译时进行优化。l为优化级别,分别为优化级别,分别03和和s。生成最终产品。生成最终产品时使用时使用-static:禁止使用共享库(动态连接库):禁止使用共享库(动态连接库)-shared:生成共享库:生成共享库-rdy

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

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

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

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

11、out c+ o hello hell.c#生成可执行程序生成可执行程序hello g+ s -o hello hello.c #生成删除符号表的可执行程序生成删除符号表的可执行程序hello 或使用或使用gcc并指定库文件来编译并指定库文件来编译c+程序:程序: gcc c hello.c #生成目标文件生成目标文件hello.ogccgcc o h o h hello.chello.c lstdclstdc+ #指定标准指定标准c+库,生成可执行程库,生成可执行程序序h编译多个文件编译多个文件greeting.h #ifndef _greeting_h #define _greeting_

12、hvoid greeting (char * name);#endif greeting.c #include #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

13、 my_app.c greeting.c o my_app$ gcc my_app.c greeting.c o my_app目录结构目录结构(2)(2)编译方式编译方式(1)(1)$ $ gcc my_app.c functions/greeting.c o my_app -i function gcc my_app.c functions/greeting.c o my_app -i function greeting.h./greeting.cmy_app.cgreeting.h./greeting.cmy_app.cfunctions编译多个文件编译多个文件目录结构目录结构(2) 编译

14、方式编译方式(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源代码文件生成可执行文件的过程,有以下四个源代码文件生成可执行文件的过程,有以下四个阶段阶段 预处理

15、预处理(也称预编译,也称预编译,preprocessing) 编译编译(compilation) 汇编汇编(assembly) 链接链接(linking) 头文件头文件 在标准在标准c中有两种形式的头文件使用方式:中有两种形式的头文件使用方式: #include #include “headfile.h”区别区别: #include 型头文件搜索范围为默认位置型头文件搜索范围为默认位置/usr/include, #include“headfile.h”型头文件的搜索位置为当前目录,在型头文件的搜索位置为当前目录,在linux的的gnu c中,若当前目标不存在中,若当前目标不存在headerfi

16、le.h,则也会到默认位置,则也会到默认位置去搜索。去搜索。 链接器与库文件链接器与库文件unix/linux的链接器为的链接器为ld,其功能是将目标文件或库文件链接在,其功能是将目标文件或库文件链接在一起,生成可执行文件,一般在编译过程的最后执行。一起,生成可执行文件,一般在编译过程的最后执行。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为

18、后缀,用于编译链为后缀,用于编译链接后生成静态可执行文件。用户可以使用库管理程序接后生成静态可执行文件。用户可以使用库管理程序ar和和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);/文件

19、文件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.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/生成生

20、成f1.o,f2.o和和f3.occ o myp f1.o f2.o f3.o/生成生成myp构造和管理静态库构造和管理静态库 用户可以使用命令用户可以使用命令ar构造自己的静态库:构造自己的静态库:cc -c f1.c f2.c#生成目标文件生成目标文件f1.o和和f2.oar crv libmyl.a f1.o f2.o#生成库生成库libmyl.aranlib libmyl.a#为子函数建立索引表为子函数建立索引表说明说明ar用于静态库文件的管理,其功能是库创建、修改和从库中取出用于静态库文件的管理,其功能是库创建、修改和从库中取出模块等模块等 ranlib用于为刚建立的库文件建立索引表

21、,通过索引表可以加快用于为刚建立的库文件建立索引表,通过索引表可以加快库文件搜索速度。其用法为:库文件搜索速度。其用法为: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系统的另一种库文件

22、为共享库,用于生成动态链接的可执行系统的另一种库文件为共享库,用于生成动态链接的可执行程序。程序。 共享库文件名的格式为:共享库文件名的格式为: libname.so.n name为库名,为库名,n为版本号。为版本号。可用命令可用命令ldd和和ldconfig命令管理共享库。命令管理共享库。 构造共享库构造共享库 共享库构造非常简单,只需要在构造库的时候使共享库构造非常简单,只需要在构造库的时候使 用用-shared参数就可以了。参数就可以了。 例如例如:用用f1.c和和f2.c构造共享库构造共享库,方法是:方法是: #生成目标文件生成目标文件 cc -c f1.c f2.c #由目标文件生成

23、共享库由目标文件生成共享库 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);

24、返回值:返回值: 成功时返回文件描述符,否则返回成功时返回文件描述符,否则返回null。dlopen函数的相关说明函数的相关说明变量变量filename为共享库名。若文件名不以为共享库名。若文件名不以/开头,则为非绝对路径名开头,则为非绝对路径名,将按以下顺序搜索库文件:,将按以下顺序搜索库文件:(1)环境变量中的环境变量中的ld_library_path值指定的路径;值指定的路径;(2)动态链接缓冲文件动态链接缓冲文件/etc/ld.so.cache;(3)库文件默认目录库文件默认目录/lib,/usr/lib。 变量变量flag用来表示在什么时候解决未定义的符号,其取值范围与意用来表示在什

25、么时候解决未定义的符号,其取值范围与意义如下义如下: (1)rtld_lazy:指定在动态链接库的函数执行时解决;:指定在动态链接库的函数执行时解决; (2)rtld_now:指定在:指定在dlopen返回前就解决所有未定义的符返回前就解决所有未定义的符号问题。一旦有未解决好未定义的符号,号问题。一旦有未解决好未定义的符号,dlopen将返回将返回null表表示错误。示错误。注意:注意:rtld_lazy和和rtld_now可以与可以与rtld_global配合使配合使用,使得那些在以后才加载的库可以获得其中的符号。用,使得那些在以后才加载的库可以获得其中的符号。2. dlsym功能:返回共享

26、中指定函数的入口地址功能:返回共享中指定函数的入口地址原型及用法:原型及用法: void *dlsym(void *handle, char *symbol);说明:说明: dlsym根据共享库文件描述符根据共享库文件描述符(handle)与符号与符号(symbol),返回,返回symbol对应的(函数)入口地址,相当于返回一个对应的(函数)入口地址,相当于返回一个(函数函数)指针。指针。 3. dlclose功能:功能: 关闭已经打开的指定共享库文件,此操作应在共享库相关操作关闭已经打开的指定共享库文件,此操作应在共享库相关操作完成之后进行。完成之后进行。原型及用法:原型及用法: int d

27、lclose (void *handle);4. dlerror 功能:功能: 返回动态共享库操作状态信息。当共享库操作函数执行失败时返回动态共享库操作状态信息。当共享库操作函数执行失败时,dlerror可以返回出错信息,否则返回值为可以返回出错信息,否则返回值为null表示成功。表示成功。 原型及用法为:原型及用法为: const char *dlerror(void); 共享库使用示例共享库使用示例 为了使用刚创建的共享库,需要对引例中的模块文件为了使用刚创建的共享库,需要对引例中的模块文件f3.c进行修改。假定修改后的文件被命名为进行修改。假定修改后的文件被命名为f3n.c,其代,其代码

28、如下:码如下: #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) fprintf(stderr,dlerror(); exit(1); f1=dlsym(sfp,f1);/获取函数获取函数f1入口地址(指针)入口地址(指针)err=dlerror();/检查是否成功检查是否成功if(er

29、r) 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);dlclose(sfp); /关闭共享库关闭共享库exit(0); 共享库使用示例共享库使用示例编译方法编译方法编译方法为:编译方法为: cc o myp f3n.c ldl 由共享库由共享库libmy.so生成可执行程序生成可执行程序myp,-ldl则指示链接程序则指示链接程序ld使

温馨提示

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

评论

0/150

提交评论