您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Unix系统下C编程
的程序,其内容为:#includestdio.hmain(){printf(“HelloWorld!\n”);}编译和执行步骤•编译–gcchello.c#生成可执行程序a.out,或–gcc–ohellohello.c#生成可执行程序hello•运行–./a.out或–./hello•输出结果HelloWorld!纲要•编译器•头文件•链接器与库文件•静态库•共享库功能及用法为什么要使用编译器?•C语言源程序需要经过编译和链接这两个过程才能转换成二进制可执行程序。•一般在Unix系统中使用的C编译器是cc(CCompiler的缩写)。在各个Linux发行版本中广泛使用的C编译器名为gcc(GNUcc)。为了保持与Unix系统的兼容,在Linux系统中cc作为了gcc的一个链接。gcc的功能•gcc能将C/C++源程序和目标程序编译并调用链接程序ld生成可执行文件,如果用户没有给出可执行文件的名字,gcc将默认生成一个名为a.out的可执行文件。gcc的用法•gcc的一般用法为:–gcc[options]filenames•其常用格式为:gcc[-c][-S][-E][-s][-g][-static][-shared][-rdynamic][-Idir…][-Ldir…][-lmylib][-Olevel][-xLanguage][-Dmacro[=defn]…][-Umacro][-mmachine-option…][-oout_file]infile…几点说明•gcc根据源程序的扩展名来决定使用哪一种语言的编译器进行编译工作。•扩展名为“.c”的文件被gcc认为是C语言的源程序文件。例如:gcchello.c•gcc编译出来的可执行程序默认是a.out。•g++是一个C++版本的gcc编译器。•g++要求C++语言源程序文件带有扩展名“.cc”或“.C”。例如:g++hello.cc,g++hello.C参数•-c:编译后仅输出*.o型的目标文件,而不连接生成可执行程序•-S:编译后仅生成汇编语言文件*.s,但不生成目标文件和可执行代码•-s:生成可执行文件时,删除符号表和重定位信息。生成成品软件时使用•-E:在预处理过程后结束,不进行编译和连接,也不生成可执行代码•-g:在可执行文件中加入调试信息,便于程序的调试参数(续)•-ooutfile:指定输出文件名。若不指定则生成a.out•-Idir:将目录dir添加到头文件搜索范围•-lmylib:连接时搜索库libmylib.a•-Ldir:将目录dir添加到库文件搜索范围•-O[L]:编译时进行优化。L为优化级别,分别0~3和s。生成最终产品时使用•-static:禁止使用共享库(动态连接库)•-shared:生成共享库•-rdynamic:连接时使用共享库gcc的常用选项gcc常用选项选项含义-c仅对源文件进行编译,不链接生成可执行文件。在对源文件进行查错时,或只需产生目标文件时可以使用该选项。-g[gdb]在可执行文件中加入调试信息,方便进行程序的调试。如果使用中括号中的选项,表示加入gdb扩展的调试信息,方便使用gdb来进行调试-O[0、1、2、3]对生成的代码使用优化,中括号中的部分为优化级别,缺省的情况为2级优化,0为不进行优化。注意,采用更高级的优化并不一定得到效率更高的代码。-Dname[=definition]将名为name的宏定义为definition,如果中括号中的部分缺省,则宏被定义为1gcc常用选项选项含义-Idir在编译源程序时增加一个搜索头文件的额外目录——dir,即include增加一个搜索的额外目录。-Ldir在编译源文件时增加一个搜索库文件的额外目录——dir-llibrary在编译链接文件时增加一个额外的库,库名为library.a-w禁止所有警告-Wwarning允许产生warning类型的警告,warning可以是:main、unused等很多取值,最常用是-Wall,表示产生所有警告。如果warning取值为error,其含义是将所有警告作为错误(error),即出现警告就停止编译。gcc的常用选项c++程序•一个c++版的HelloWorld程序,其文件名为hello.C,内容为:#includeiostream.hmain(void){coutHello,World!endl;}编译方法•使用c++或g++来编译:–g++hello.C#生成可执行程序a.out–c++–ohellohell.C#生成可执行程序hello–g++–s-oHellohello.C#生成删除符号表的可执行程序Hello•或使用gcc并指定库文件来编译c++程序:–gcc–chello.C#生成目标文件hello.o–gcc–ohhello.C–lstdc++#指定标准c++库,生成可执行程序h编译多个文件greeting.h#ifndef_GREETING_H#define_GREETING_Hvoidgreeting(char*name);#endifgreeting.c#includestdio.h#includegreeting.hvoidgreeting(char*name){printf(Hello%s!\r\n,name);}my_app.c#includestdio.h#includegreeting.h#defineN10intmain(void){charname[N];printf(YourName,Please:);scanf(%s,name);greeting(name);return0;}•目录结构(1)–编译命令•$gccmy_app.cgreeting.c–omy_app•目录结构(2)–编译方式(1)$gccmy_app.cfunctions/greeting.c–omy_app-Ifunctiongreeting.h./greeting.cmy_app.cgreeting.h./greeting.cmy_app.cfunctions编译多个文件•目录结构(2)–编译方式(2)•分步编译•命令:–1、$gcc-cmy_app.c-Ifunctions–2、$gcc-cfunctions/greeting.c–3、$gccmy_app.ogreeting.o–omy_app•思路:–编译每一个.c文件,得到.o的目标文件;–将每一个.o的目标文件链接成一个可执行的文件;编译多个文件gcc的工作过程使用gcc/g++由C源代码文件生成可执行文件的过程,有以下四个阶段∶–预处理(也称预编译,Preprocessing)–编译(Compilation)–汇编(Assembly)–链接(Linking)头文件•在标准C中有两种形式的头文件使用方式:–#includeheadfile.h–#include“headfile.h”•区别:–#includeheadfile.h型头文件搜索范围为默认位置/usr/include,–#include“headfile.h”型头文件的搜索位置为当前目录,在Linux的GNUC中,若当前目标不存在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(intarg){printf(”F1:youpassed:%d\n”,arg);}//文件f2.c的内容:f2(char*arg){printf(”F2:youpassed:%s\n”,arg);}//文件f3.c的内容#includestdio.hmain(){fprintf(stderr,”Begine:\n”);f1(15);f2(”HelloWorld!”);fprintf(stderr,”:End\n”);exit(0);}程序举例编译与链接可以采用各模块文件分别编译然后再统一链接的办法进行编译。•cc–cf1.cf2.c//生成f1.o和f2.o•cc–off3.cf1.of2.o//生成f•cc–ofpf3.cf1.cf2.c//生成fp•cc–cf1.cf2.cf3.c//生成f1.o,f2.o和f3.o•cc–omypf1.of2.of3.o//生成myp构造和管理静态库•用户可以使用命令ar构造自己的静态库:–cc-cf1.cf2.c#生成目标文件f1.o和f2.o–arcrvlibmyl.af1.of2.o#生成库libmyl.a–ranliblibmyl.a#为子函数建立索引表说明•ar用于静态库文件的管理,其功能是库创建、修改和从库中取出模块等•ranlib用于为刚建立的库文件建立索引表,通过索引表可以加快库文件搜索速度。其用法为:–ranlib[-vV]ar_file使用自己的库•#使用库libmyl.a和f3.c生成可执行程序fp:•cc-ofpf3.clibmyl.a•#使用库libmyl.a和f3.o生成可执行程序fp:•cc-ofpf3.olibmyl.a•#-L指定当前目录,-lmyl指定静态库文件libmyl.a:•cc-ofpf3.c-L.–lmyl共享库•Linux系统的另一种库文件为共享库,用于生成动态链接的可执行程序。–共享库文件名的格式为:libNAME.so.N–NAME为库名,N为版本号。•可用命令ldd和ldconfig命令管理共享库。构造共享库•共享库构造非常简单,只需要在构造库的时候使用-shared参数就可以了。•例如:用f1.c和f2.c构造共享库,方法是:–#生成目标文件–cc-cf1.cf2.c–#由目标文件生成共享库–cc-shared-olibmy.sof1.of2.o–#由源文件生成共享库–cc-shared-olibmy.so-cf1.cf2.c共享库的使用•共享库要使用头文件dlfcn.h和几个相关的函数:–dlerror–dlopen–dlsym–dlclose。1.dlopen•功能:–用于打开指定共享库,并返回文件描述符。•原型及用法:–void*dlopen(constchar*filename,intflag);•返回值:–成功时返回文件描述符,否则返回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将返回N
本文标题:Unix系统下C编程
链接地址:https://www.777doc.com/doc-4013154 .html