Linux下C编程.pdf

上传人:qwe****56 文档编号:70014121 上传时间:2023-01-14 格式:PDF 页数:59 大小:633.42KB
返回 下载 相关 举报
Linux下C编程.pdf_第1页
第1页 / 共59页
Linux下C编程.pdf_第2页
第2页 / 共59页
点击查看更多>>
资源描述

《Linux下C编程.pdf》由会员分享,可在线阅读,更多相关《Linux下C编程.pdf(59页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、LinuxLinux 下下 C C 编程编程LinuxLinux 下编程概述下编程概述系统调用与库函数系统调用与库函数gccgcc、gdbgdb 的使用的使用makemake编程语言编程语言高级语言高级语言C/C+,Java,C/C+,Java,ELF binary formatELF binary formatExcutable and Linkable FormatExcutable and Linkable Format支持动态连接和重定位支持动态连接和重定位脚本语言脚本语言Shell:sh/bash,csh,kshShell:sh/bash,csh,kshPython,Perl,tcl

2、/tk,sed,awkPython,Perl,tcl/tk,sed,awk开发工具开发工具GCCGCCGNU C Compiler-GNU Compiler CollectionGNU C Compiler-GNU Compiler CollectionGDBGDBGNU DebuggerGNU DebuggerThe gdb commandThe gdb command其他调试工具:其他调试工具:xxdgbxxdgbBinary utilitiesBinary utilitiesas,ld,aras,ld,arMakeMakeapt-get install build-essential a

3、pt-get install build-essential workbenchworkbenchIDEEmacs/xemacsEclipseKdevelopKylix3命令行Editor:vi/vim/gvim,emacs/xemacsSource Reader:vi/emacs+ctags/etags;source navigatorConfigure Tools:automake,autoconf,m4从程序员角度看从程序员角度看 LinuxLinux系统调用和函数库系统调用和函数库系统调用属系统调用属 LinuxLinux 内核内核LinuxLinux 内核的对外接口,用户程序和内核之

4、内核的对外接口,用户程序和内核之间唯一的接口间唯一的接口系统调用可以实现从用户态到核心态的转系统调用可以实现从用户态到核心态的转变变系统调用有系统调用有 300300 多个多个man syscalls man syscalls 查看所有的系统调用查看所有的系统调用man 2 man 2 系统调用名,如系统调用名,如 man 2 openman 2 open 不同系统调用所需的头文件不同不同系统调用所需的头文件不同系统调用所需的头文件存放在系统调用所需的头文件存放在/usr/include/usr/include及其子目录或及其子目录或/usr/include/sys/usr/include/s

5、ys 中中系统底层开发、进程管理等方面的涉及系统底层开发、进程管理等方面的涉及系统内部操作的问题,一般利用系统调系统内部操作的问题,一般利用系统调用,可以提高程序的执行效率用,可以提高程序的执行效率 函数库(函数库(glibcglibc)不属操作系统内核)不属操作系统内核依赖于系统调用依赖于系统调用建立在系统调用的上层,提供的功能比系统建立在系统调用的上层,提供的功能比系统调用强,使用也比较方便调用强,使用也比较方便库文件是编写用来进行代码重用的预编译的库文件是编写用来进行代码重用的预编译的函数的集合函数的集合查找库函数查找库函数man 3 man 3 库函数名,如库函数名,如 man 3 f

6、openman 3 fopen库函数的头文件包含在库函数的头文件包含在 usr/includeusr/include 下下相应的库存放在相应的库存放在 liblib 或或 usr/libusr/lib 下下一般应用程序调用库函数实现一般应用程序调用库函数实现 函数库分两大类函数库分两大类静态库(静态库(.a.a)gcc+argcc+ar动态库动态库/共享库(共享库(.so.so)gcc gcc 函数库命名函数库命名库文件的名字通常是以库文件的名字通常是以 liblib 开始的开始的,余下的余下的部分表示这个库是什么,最后的部分是以部分表示这个库是什么,最后的部分是以.开始的用来表明这个库的类型

7、。如:开始的用来表明这个库的类型。如:libc.solibc.so标准标准 c c 库,库,libm.solibm.so 代表算术库代表算术库 调用关系调用关系 调用方式调用方式编程中要包含系统调用或库函数所要的编程中要包含系统调用或库函数所要的头文件头文件使用非标准库函数时,编译时还要指定使用非标准库函数时,编译时还要指定所使用的库所使用的库 系统调用示例系统调用示例在当前目录下创建用户可读写文在当前目录下创建用户可读写文“件“件hello.txt”hello.txt”“,在其中写入“,在其中写入Hello,Software Hello,Software weekly”weekly”,关闭该

8、文件。再次打开该文件,读,关闭该文件。再次打开该文件,读 取其中的内容并输出在屏幕上。取其中的内容并输出在屏幕上。库函数调用库函数调用 C C 语言编译语言编译过程过程 GCCGCC可以编译多种语言可以编译多种语言C CC+C+JavaJavaObjective-C/C+Objective-C/C+FORTRANFORTRANAdaAda4 stages of GCC4 stages of GCC预处理预处理 Preprocessor(cpp command)Preprocessor(cpp command)编译编译 CompilerCompiler(cc commandcc command)

9、汇编汇编 Assembler(as command)Assembler(as command)链接链接 Linker(ld command)Linker(ld command)GCCGCC 所支持的后缀名解释所支持的后缀名解释未经预处理的汇编语言原始程序汇编程序文件C+头文件(预处理文件)C or C+头文件(预处理文件)已经过预处理的 C+原始程序 未经预处理的 C+源程序 已经过预处理的 C 原始程序 未经过预处理 C 源程序.S.s.H.hh.h.ii.cc.cp.cpp.CPP.c+.C.cxx.i.c 动态链接库文件(shared object).so 静态链接库文件(archive

10、 file).a目标文件.oGCCGCC 选项选项使用方法使用方法:gcc options filenamegcc options filename基本选项基本选项:-E:-E:只对源程序进行预处理只对源程序进行预处理-S:-S:只对源程序进行预处理、编译只对源程序进行预处理、编译-c:-c:执行预处理、编译、汇编而不链接执行预处理、编译、汇编而不链接-o output_file:-o output_file:指定输出文件名指定输出文件名-g:-g:产生调试工具必需的符号信息产生调试工具必需的符号信息-O/On:-O/On:在程序编译、链接过程中进行优化处在程序编译、链接过程中进行优化处理理-

11、Wall:-Wall:显示所有的警告信息显示所有的警告信息-I dir:-I dir:指定额外的头文件搜索路径指定额外的头文件搜索路径-Ldir:-Ldir:指定额外的库文件搜索路径 指定额外的库文件搜索路径-lname:-lname:链接时搜索指定的库文件链接时搜索指定的库文件-D MACRO=DEFN:-D MACRO=DEFN:定义定义 MACROMACRO 宏宏-fpic-fpic:输出的对象模块式按照可重定位地址输出的对象模块式按照可重定位地址(relocatable addressingrelocatable addressing)方式生成的)方式生成的-shared-shared

12、:创建共享库:创建共享库 示例示例 1 1test.c,/tmp/test.htest.c,/tmp/test.h 编译、运行编译、运行(指定头文件所在目录指定头文件所在目录)$gcc I./tmp D STRING=$gcc I./tmp D STRING=“you are right”“you are right”o test test.co test test.c$./test$./test 示例示例 2 2(静态库)(静态库)first.cfirst.csecond.csecond.c 单独的编译这些函数来创建目标文件 单独的编译这些函数来创建目标文件 gcc-c first.c se

13、cond.c gcc-c first.c second.c 创建静态库 创建静态库 ar rcs libtest.a first.o second.oar rcs libtest.a first.o second.o为库创建一个头文件为库创建一个头文件 lib.h lib.h 编写程序编写程序 program.cprogram.c 来调用库函数中的来调用库函数中的函数函数 使用静态库来编译使用静态库来编译 program.cprogram.c需要指定库的位置编译及库名需要指定库的位置编译及库名 gcc-o program program.c L.-ltest gcc-o program pro

14、gram.c L.-ltest ./program./program 示例示例 3 3(共享库)(共享库)first.cfirst.csecond.csecond.c 编译共享库编译共享库$gcc-c-fpic first.c second.c$gcc-c-fpic first.c second.c$gcc-shared first.o second.o-o hello.so$gcc-shared first.o second.o-o hello.so 或合成一条命令:或合成一条命令:$gcc-fpic-shared first.c second.c-o libtest.so$gcc-fpic

15、-shared first.c second.c-o libtest.so为共享库创建一个头文件为共享库创建一个头文件 test.ctest.c 调用两个共享库中的函数调用两个共享库中的函数 编译、运行编译、运行$gcc test.c o test L.ltest$gcc test.c o test L.ltest将将 libtest.solibtest.so 复制到复制到 liblib 目录 或 目录 或$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.$./test$./t

16、est注意注意:运行时动态链接:运行时动态链接GDBGDBGDB:GNU DebugGDB:GNU Debug,调试,调试 gccgcc 编译的程序编译的程序设置断点设置断点监视变量值监视变量值单步执行单步执行修改变量值修改变量值编译时要带编译时要带-g-g 属性,如属性,如 gcc g hello.c o hello gcc g hello.c o hello gdb gdb 运行要调试的程序运行要调试的程序GDBGDB 命令命令不退出 gdb 就执行 makemake不退出 gdb 就执行 shell 命令shell中止正在调试的程序kill执行当前调试的程序run退出 gdbquit临时

17、显示表达式的值print显示表达式的值display打开要调试的文件file执行一条语句,是函数则进入函数内部step执行一条语句但不进入函数内部next列出源代码的一部分list设置断点,可以是行号、函数名及地址tbreak 设置临时断点break/tbreakwatch监视一个变量的值而不管它何时被改变 makemake 与与 makefilemakefilemulti-file projectmulti-file projectIDEIDEmakemakemake&makefilemake&makefilemakefilemakefile 描述模块间的依赖关系描述模块间的依赖关系make

18、make 命令根据命令根据 makefilemakefile 对程序进行管理和对程序进行管理和维护维护makemake 判断被维护文件的时序关系判断被维护文件的时序关系makefilemakefile 的命名的命名GNUmakefileGNUmakefilemakefilemakefileMakefileMakefile当当 makemake 寻找寻找 makefilemakefile 文件时,它试图搜寻具有文件时,它试图搜寻具有如下的名字的文件,按顺序:如下的名字的文件,按顺序:GNUmakefileGNUmakefile,makefilemakefile,MakefileMakefilem

19、makefileakefile 模板模板一个简单的一个简单的 MakefileMakefile 文件包含一系列文件包含一系列“”的 规则,其样式如下:“”的 规则,其样式如下:目标目标(targettarget):依赖依赖(prerequiries)(prerequiries)命令命令(command)(command)目标目标(targettarget):依赖依赖(prerequiries)(prerequiries)命令命令(command)(command)目标目标(target)(target):要产生的文件的名称:要产生的文件的名称通常是可执行文件或通常是可执行文件或 OBJOBJ

20、文件或执行的动文件或执行的动作名称作名称以以.开始的是伪目标开始的是伪目标依赖依赖(prerequiries)(prerequiries):生成目标所需的文件生成目标所需的文件一个目标经常有几个依赖一个目标经常有几个依赖也可以没有依赖只有动作也可以没有依赖只有动作命令(命令(commandcommand):):mmakeake 执行的动作执行的动作可以含有几个命令,每个命令占一行可以含有几个命令,每个命令占一行每个命令行前面必须是一个每个命令行前面必须是一个 t tabab 字符字符命令中可以包含命令中可以包含 shellshell 命令命令注释以注释以#开始开始makemake 命令执行一般

21、格式:命令执行一般格式:make-f filenametargetnamemake-f filenametargetname缺省目标,如缺省目标,如 makemake默认为第一个目标默认为第一个目标伪目标不能做缺省目标伪目标不能做缺省目标指定目标:指定目标:make make targetnametargetname如如 make cleanmake clean 从目录中删除生成的目标文件和从目录中删除生成的目标文件和可执行文件可执行文件 editedit 指定目标指定目标每次每次 makemake 首先检查它的依赖文件是否首先检查它的依赖文件是否已经更新已经更新指定指定 makemake 读

22、取的读取的 makefilemakefile 文件:文件:make-f filenamemake-f filenameGNUGNU 的的 makemake 的工作过程如下:的工作过程如下:依次读入各依次读入各 makefilemakefile 文件文件初始化文件中的变量初始化文件中的变量分析所有规则分析所有规则为所有的目标文件创建依赖关系链为所有的目标文件创建依赖关系链根据依赖关系和时间数据,确定哪些目标文根据依赖关系和时间数据,确定哪些目标文件要重新生成件要重新生成执行相应的生成命令执行相应的生成命令 示例示例 1 1Hello WorldHello World 小程序的小程序的 makef

23、ilemakefile hello:hello.ohello:hello.o gcc o hello hello.ogcc o hello hello.o hello.o:hello.chello.o:hello.c gcc c hello.cgcc c hello.c示例示例 2 2依赖关系如下:依赖关系如下:MakefileMakefile myprog:main.o prog1.o prog2.o prog3.omyprog:main.o prog1.o prog2.o prog3.o gcc o myprog main.o prog1.o prog2.o prog3.o gcc o m

24、yprog main.o prog1.o prog2.o prog3.o main.o:main.c lib1.hmain.o:main.c lib1.h gcc c main.o main.c lib1.hgcc c main.o main.c lib1.h prog1.o:prog1.c lib1.hprog1.o:prog1.c lib1.h gcc c prog1.o prog1.c lib1.hgcc c prog1.o prog1.c lib1.h prog2.o:prog2.c prog2.o:prog2.c gcc c prog2.o prog2.cgcc c prog2.o

25、prog2.c prog3.o:prog3.c lib2.hprog3.o:prog3.c lib2.h gcc c prog3.o prog3.c lib2.hgcc c prog3.o prog3.c lib2.h 示例示例 3 3 makefile makefile 扩展扩展makefilemakefile 扩展扩展变量用户定义变量、变量用户定义变量、环境变量、自动变环境变量、自动变量或预定义变量量或预定义变量隐式规则隐式规则条件语句条件语句嵌套嵌套Using info makeUsing info make用户自定义变量用户自定义变量定义变量的一般格式是:定义变量的一般格式是:=引用变

26、量:引用变量:$($(变量名变量名)示例示例 3 3 中定义成变量中定义成变量 OBJECTSOBJECTS=main.o kbd.o command.o display.o=main.o kbd.o command.o display.o insert.o search.o files.o utils.oinsert.o search.o files.o utils.o 改进后的改进后的 makefilemakefile 自动变量自动变量自动变量自动变量 makemake 中定义了一些它们的中定义了一些它们的值会因环境的不同而发生改变的变量值会因环境的不同而发生改变的变量$表示规则中的目标文

27、件集合表示规则中的目标文件集合$?$?所有比目标文件还新的那些相依文件所有比目标文件还新的那些相依文件的集合,以空格分开的集合,以空格分开$规则中的第一个依赖文件的名称规则中的第一个依赖文件的名称$规则中所有不重复的依赖文件的集合规则中所有不重复的依赖文件的集合,以空格分开,以空格分开$%$%仅当目标文件是一个静态库成员时,仅当目标文件是一个静态库成员时,表示规则中的目标成员名,而此时表示规则中的目标成员名,而此时$表示表示相应库文件的名称相应库文件的名称$*$*如果目标文件的后缀是如果目标文件的后缀是 makemake 所识别所识别的,则的,则$*$*就是去掉后缀的目标文件名,但就是去掉后缀

28、的目标文件名,但该引用只有用在隐含规则中才有意义该引用只有用在隐含规则中才有意义 预定义变量预定义变量归档库归档库:AR ARFLAGSAR ARFLAGS 汇编命令:汇编命令:AS ASFLAGSAS ASFLAGSC C 编译命令编译命令:CC CPP CFLAGS CC CPP CFLAGS CPPFLAGSCPPFLAGSC+C+编译命令编译命令:CXX CXXFLAGSCXX CXXFLAGS 例:例:隐式规则隐式规则在在 makefilemakefile 文件中文件中明确地指定了一些规明确地指定了一些规则,称为显式规则则,称为显式规则 隐式规则就是一种惯例,即预先约定好隐式规则就是一种惯例,即预先约定好了,不需要在了,不需要在 makefilemakefile 文件中写出来的文件中写出来的规则规则几个常用的隐式规则:几个常用的隐式规则:makemake 自动推导 自动推导具有多个目标的规则具有多个目标的规则伪目标跳过搜索依赖伪目标跳过搜索依赖 示例示例 3 3 可简化为:可简化为:示例示例 3 3 还可简化为还可简化为 示例示例 4 4Linux-0.11Linux-0.11 的的 MakefileMakefile层次化层次化 ReviewReview系统调用和库函数系统调用和库函数gccgccgdbgdbmakemake

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁