Linux培训C编程_第1页
Linux培训C编程_第2页
Linux培训C编程_第3页
Linux培训C编程_第4页
Linux培训C编程_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、内容提纲内容提纲lgcclgdblMakelWindows到Linux程序移植C C语言简介语言简介l在80年代末期美国国家标准协会(American National Standards Institute)发布了一个被称为ANSI C的C语言标准。这更加保证了将来在不同平台上的C的一致性。lLinux上可用的C编译器是GNU C编译器, 它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布。你能在Linux的发行光盘上找到它 GNU C GNU C 编译器编译器 一、基本用法 gcc options filenames说明:l在gcc后面可以有多个编译选项,同时进行多个编译操作。很

2、多的gcc选项包括一个以上的字符。因此你必须为每个选项指定各自的连字符。例如,下面的两个命令是不同的:l当不用任何选项编译一个程序时,GCC将会建立(假定编译成功)一个名为a.out的可执行文件。 基本编译选项基本编译选项l-o选项 你能用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out。l -c选项:告诉GCC仅把源代码编译为目标代码而跳过汇编和连接的步骤。这个选项使用的非常频繁,因为它使得编译多个C程序时速度更快并且更易于管理。缺省时GCC建立的目标代码文件有一个.o的扩展名。 警告选项警告选项 在gcc中用开关-Wall控制警告信息,使用示例命令如下:查找选项查找选

3、项 gcc一般使用默认路径查找头文件和库文件。如果文件所用的头文件或库文件不在缺省目录下,则编译时要指定它们的查找路径。l-I选项:指定头文件的搜索目录例:l-L选项:指定库文件的搜索目录例:多个源文件生成一个可执行文件多个源文件生成一个可执行文件 问题:有多个源文件时,如何生成一个可执行文件?l方法2:gcc-Wall c test3.c 优化选项优化选项 优化选项可以使GCC在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件。这些选项中最典型的是-O和-O2选项。l-O选项:告诉GCC对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。l-O2选项:告诉GCC

4、产生尽可能小和尽可能快的代码。-O2选项将使编译的速度比使用-O时慢。但通常产生的代码执行速度会更快。 版本选项版本选项l-v选项 用户将会得到自己目前正在使用的gcc的版本及与版本相关的一些信息。 gcc -v 将得到如下结果:l-V 选项 如果安装了多个版本的gcc,并且想强制执行其中的某个版本,可以用命令通知系统用户要使用的版本。 gcc -V2.6.3 -v调试和剖析选项调试和剖析选项 使用调试选项后,gcc在进行编译的时候,在目标文件(.o)和创建的可执行文件中插入额外信息,这些额外信息使gdb能够判断编译过的代码和源代码之间的关系。l-g选项:告诉GCC产生能被 GNU 调试器使用

5、的调试信息以便调试你的程序。l-pg选项:告诉GCC在你的程序里加入额外的代码,执行时,产生gprof用的剖析信息以显示你的程序的耗时情况。l使用gdb调试工具,命令行如下: 用用gdbgdb调试调试GCCGCC程序程序 gdb是一个用来调试C和C+程序的常用调试工具之一。 gdb所提供的一些功能:l监视程序中变量的值。l设置断点以使程序在指定的代码行上停止执行。 l逐行执行代码。l分析崩溃程序的产生的core文件gdbgdb基本用法基本用法 需要调试的程序,在编译时要使用调试选项。在默认的情况下,调试符号不会编译到程序中。调试之后,不需要重新编译程序。gdb filename出现(gdb)在

6、这里,可以输入调试命令基本基本gdbgdb命令命令lfile 装入想要调试的可执行文件。lkill 终止正在调试的程序。llist 执行一行源代码但不进入函数内部。lnext 执行一行源代码但不进入函数内部。lstep 执行一行源代码而且进入函数内部。lrun 执行当前被调试的程序lquit 终止 gdblwatch 能监视一个变量的值而不管它何时被改变。lbreak 在代码里设置断点, 这将使程序执行到这里时被挂起。lmake 能不退出 gdb 就可以重新产生可执行文件。lshell 能不离开 gdb 就执行 UNIX shell 命令。GDBGDB的静态调试启动方法的静态调试启动方法l当需

7、要在命令行通过gdb来启动可执行程序的时候:gdb l此时gdb会加载可执行程序的符号表和堆栈,并为启动程序作好准备;l设置可执行程序的命令行参数: set args l设置断点: b或breakl通过命令r或run来启动程序,或者通过c或continue命令来继续已经被暂停的程序;l当程序core的时候,需要查看core文件的内容,使用以下方式: gdb l此时候,gdb会结合可执行程序的符号和堆栈来查看core文件内容,以分析程序在core掉时的内存影象;GDBGDB的动态调试启动方法的动态调试启动方法l动态调试就是在不终止正在运行的进程的情况下来对这个正在运行的进程进行调试lgdb l直

8、接在gdb中把一个正在运行的进程连接到gdb中,以便于进行动态调试使用attach命令: attach detach: 调试结束之后,可以使用该命令断开进程与gdb的连接l使用attach命令的例子:gdbfile #指定进程所关联的程序源代码和符号表 attach . 使用gdb的命令进行调试; . detach #调试结束,解除进程与gdb的连接,使进程继续运行GDBGDB调试过程中使用到的概念和命令调试过程中使用到的概念和命令lgdb的工作路径:pwd: 查看gdb当前的工作路径; cd : 改变gdb当前的工作路径; info terminal:显示gdb当前所使用的终端的类型信息gd

9、bgdb的环境的环境lshow paths: 显示当前路径变量的设置情况;lshow environment/env VARNAME:显示程序的环境变量VARNAME的值;lset environment/env VARNAME = VALUE:设置程序的某个环境变量VARNAME的值;只对所调试的程序有效,对gdb本身不起作用lunset environment/env VARNAME:删除程序的某个环境变量VARNAME;断点断点l断点的作用是当程序运行到断点时,无论它在做什么,都会被停止下来.对于每个断点,你还可以设置一些更高级的信息以决定断点在什么时候起作用.l设置断点的位置:代码行、

10、函数上、地址上.在那些含有异常处理的语言(如C+)中,还可以在异常发生的地方设置断点l断点分为普通断点和条件断点设置普通的断点设置普通的断点l使用break/b命令来设置普通断点;有很多种方法可以设置断点:A、break FUNCTION 在某个函数上设置断点B、break +OFFSET 或 break OFFSET 程序运行到当前行时的前几行或后几行; OFFSET表示行号; C、break LINENUM 在行号为LINENUM的行上设置断点. D、break FILENAME:LINENUM 在FILENAME文件中的第LINENUM行上设置断点; E、break FILENAME:F

11、UNCTION 在FILENAME文件中的名为FUNCTION的函数上设置断点 F、break *ADDRESS 在地址ADDRESS上设置断点.这个命令允许你在没有调试信息的程序中设置断点;G、break 不含任何参数的break命令,会在当前执行到的程序运行栈中的下一条指令上设置一个断点.条件断点条件断点l条件断点就是设置的断点只在某个条件成立的时候才有效,才会使程序在运行到断点之前停止; break . if CONDITIONl这个命令设置一个条件断点,条件由CONDITION来决定.在gdb每次执行到此时,如果CONDITION条件的值被计算为非0,那么程序就在该断点处停止;ltbr

12、eak ARGS:l该命令设置断点为只有效一次.ARGS的使用同break中的参数的使用删除断点删除断点l当一个断点使用完之后,需要删除这些断点;clear命令和delete命令可以完成这项任务; A、clear: 不带任何参数的clear命令会在当前所选择的栈上清除下一个所要执行到的断点(指令级).当你当前的栈帧是栈中最内层的时候,使用这个命令可以很方便地删除刚才程序停止处的断点; B、clear FUNCTION 和 clear FILENAME:FUNCTION 删除名为FUNCTION的函数上的断点; C、clear LINENUM 和 clear FILENAME:LINENUM 删

13、除第LINENUM行上的断点; D、delete breakpoints BNUMS.使断点暂时不起作用使断点暂时不起作用l使用enable命令来激活断点或观察点l使用disable命令来使断点或观察点暂时不起作用l使用info break或info watch命令来观察哪些断点是活跃的;设置观察点设置观察点l可以使用一个观察点来停止一个程序的执行,当某个表达式的值改变时,观察点将会停止程序,而不需要事先在某个地方设置一个断点 A、watch EXPR watch命令使用EXPR作为表达式设置一个观察点.gdb将把表达式加入到程序中,并监视程序的运行,当表达式的值被改变的时候,gdb将会停止程

14、序 B、rwatch EXPR: 使用EXPR作为表达式设置一个断点,当EXPR被程序读取时,程序被gdb暂停 C、awatch EXPR: 使用EXPR作为表达式设置一个观察点,当EXPR被读出然后被写入时,gdb会暂停程序;这个命令常和rwatch合用 D、info watchpoints: 显示所有设置的观察点的列表;它与info breakpoints命令类似其它其它gdbgdb调试命令调试命令lcontinue/c: 继续运行被中断的程序;lbacktrace/bt: 显示当前堆栈的内容;lprint/p : 打印表达式或变量的值;lframe/f : 选择一个栈帧,并进入这个栈帧,

15、同时打印被选择的栈帧的内容摘要信息;该命令的参数是一个栈帧的号码或者是一个栈帧地址;linfo stack/frame: 显示栈/帧的摘要信息;lrun/r: 在gdb中启动并运行程序;lhelp info: 显示命令info的用法;lhelp : 显示命令Command的详细用法对多线程程序的调试对多线程程序的调试lthread THREAD_NO: 该命令用于在线程之间进行切换,把线程号为THREAD_NO(gdb设置的线程号)的线程设置为当前线程linfo threads: 查询当前进程所拥有的所有线程的状态摘要信息;gdb按照顺序显示:a、线程号: gdb为被调试进程中的线程设置的顺序

16、号;b、目标系统的线程标识;c、此线程的当前栈信息;l一些前面带*号的线程,表示该线程是当前线程;lthread apply THREAD_NO ALL ARGS: 该命令用于向线程提供命令 实例实例l程序test3_1a.c(简单程序样例)(程序优化样例 ,用命令time ./test3_2查看效果)l程序test3_3.c(错误程序的例子,用gdb查错)程序自动维护工具程序自动维护工具makemake问题:当开发的程序非常庞大,且关系复杂,手工编译链接非常困难解决: 利用一个自动系统控制和协调整个程序的创建过程。在这个自动系统中,程序员可以定义创建规则并通过这个规则进行项目的开发。 mak

17、efile就是定义这种规则的文件。GNU make 解释执行Makefile/makefile。make是一种自动生成和维护目标程序的工具。l可以调用编译器、连接器等l根据程序各部分的修改情况,重新编译链接目标代码l输入make命令后,系统自动检测系统文件和以定义的规则,完成整个创建过程 程序自动维护工具程序自动维护工具makemake简单makefile文件的写法由若干规则组成,每个规则说明一个目标规则的格式:目标目标 属性属性分隔符分隔符 依赖文件依赖文件;命令菜单命令菜单 命令菜单命令菜单 说明:表示可选,表示可以多次出现 涉及的文件名允许用通配符 程序自动维护工具程序自动维护工具mak

18、emakemakemake命令的使用命令的使用 make option macrodef targetlmake命令默认的文件是makefile(Makefile),也可以用“-f 文件名”指定要解释执行的文件。lmake默认从文件指定的第一条规则开始执行,并根据第一条中的依赖文件顺次执行。也可以通过target直接指定执行的目标。LinuxLinux到到WindowsWindows之间程序代码移植之间程序代码移植l移植的一些考虑原则:l引入新的代码,而不修改原有的代码。在没有办法进行调试前修改源代码是不允许的,修改的不好就会引起最后代码运行逻辑的混乱,而且在代码能够运行之前是很难发现问题的。所以除非非常有把握,否则不要修改被移植工程的源代码。l引入新的代码之后,不能因为

温馨提示

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

评论

0/150

提交评论