UNIX下C程序的编译与调试

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

三、UNIX下C程序的编译与调试

3.1 CC编译器

我们用cc来编译生成目标文件,或者生成可执行文件。其实cc可以生成包括.o目标文件、.i 预处理文件等在内的中间过程文件。中间过程文件可以由后缀指出其类型:

.c:C源文件。默认处理过程是预处理、编译、汇编。

.C:C++源文件。默认处理过程是预处理、编译、汇编。

.cc:C++源文件。默认处理过程是预处理、编译、汇编。

.cxx:C++源文件。默认处理过程是预处理、编译、汇编。

.m:Objective-C源文件。默认处理过程是预处理、编译、汇编。

.i:经过预处理的C文件。默认处理过程是编译、汇编。

.ii:经过预处理的C++文件。默认处理过程是编译、汇编。

.s:汇编器的源文件。默认处理过程是汇编。

.S:汇编器的源文件。默认处理过程是预处理、汇编。

.h:预处理器需要的头文件。一般不出现在命令行上。

其他后缀的文件将送给连接器(linker)。一般包括:

.o:目标文件。

.a:归档文件(库文件)。

链接过程是上面处理过程的最后一步,除非指定了-c、-S或-E任选项。

一般cc的命令格式如下:

cc [option | filename]

每个任选项由“-”开头,每个任选项分开使用。例如:任选项-dr与任选项-d -r完全不同。下面看一些常用的任选项:

-c只编译不连接,生成.o文件。编译器对每个源文件输出与该文件相符的目标文件。常常用于编译不包含主程序的子程序文件。

-o outputfile 指定输出文件的名字outputfile。不管指定名字的文件是一个可执行文件、目标文件、汇编文件还是预处理文件。缺省的输出可执行文件是a.out。

如果使用了-c参数,则缺省的输出文件为将源程序文件名的后缀改为.o。

-g在编译时产生额外的符号表(调试信息),同时将选项-lg传给连接程序(ld)以使它连接g库(/usr/lib/libg.a),从而使程序可用dbx调试。

-I pathname在搜索include文件的目录列表中增加新的目录。除非源程序中指定

了绝对路径,否则cc在编译时将先后在源程序所在的路径、由-I指定

的路径和缺省路径/usr/include中寻找源程序中#include的文件。

-l library连接指定的函数库。比如用-lm连接数学库。被连接的库将是库函数路

径中的lib**.so或lib**.a,其中**为-l后的字符串。

-L directory在缺省的库函数路径(usr/lib)外增加另外的库函数寻找路径。

-temp=directory指定编译连接时采用目录directory作为存放临时文件的路径。

如不指定,则临时路径为/tmp,当/tmp较小或已经较满时可能无法编译

较大的程序,此时需指定temp路径。

-w在编译时不列出警告信息。

-W 显示额外的警告消息。

-O优化执行代码,有的编译器还可以通过指定-O1、-O2、-O3等来指定优化的程度。

-S在编译步骤后停止,不进行汇编。输出的是一个可由汇编器(assembler)汇编的文件。一般情况生成的可汇编文件名由源文件(文件名后缀为“.c”、“I”

等)的更改为.s为后缀的文件。

-E在预处理后停止,不进行编译。输出文件是预处理过的代码,并送往标准输出。

-v在标准错误输出上显示编译器执行各步骤的命令。也显示版本信息。

-I-在-I-任选项之前由-I指定的任何目录只用来搜索#include “头文件名”,而不用来搜索#include <头文件名>。命令行中-I-后的-I任选项指出的目录可以

用来搜索所有#include包含的头文件。

-D macro定义宏macro,宏macro的值为字符串“1”。

-D macro=defn定义宏macro,其值为defn。所有命令行上的-D任选项在-U任选项之前处理。

-U macro取消宏macro的定义。该任选项在-D任选项之后处理,但在-include任选项和-imarcos任选项之前处理。

-static当系统支持共享库链接时,才支持该任选项。该任选项阻止链接器链接共享库。

-shared产生一个可共享的目标,其他目标文件链接该目标形成可执行文件。

举例:

1、如果所有程序都在一个文件myprog.c中,那么只需用

cc myprog.c

即可完成编译连接的全过程,所生成的执行文件是a.out。

2、如果源程序由两个文件mymain.c和mysubs.c组成,程序中使用了系统的数学

库,我们希望生成的执行文件叫myprog,则编译连接的命令为:

cc mymain.c mysubs.c –lm –o myprog

3.2 dbx调试器

Unix系统下有若干调试工具软件,比较常用的有dbx。目前还常见的是GNU的gdb和X下图形界面的调试工具ddd。

dbx是一种源程序级的调试工具。虽然dbx不象在IDE(集成开发环境)中那样使用热键,但对于IDE中各种功能在dbx中都可以找到等同的命令。

要使用dbx调试程序,首先在编译生成执行文件时要加上调试信息,即使用-g任选项。否则dbx调试时,没有符号表,将只能看到汇编命令。例如:

cc -g example.c progmain.c -o myprog

这样在dbx中就可以按源代码跟踪。注意:dbx不仅可以用于调试C程序,对其他语言的程序也可以用dbx调试,而且可以对汇编程序跟踪。

3.2.1运行dbx

dbx命令的格式为:dbx [options] [progname corefile]]

例如:% dbx a.out

% dbx myprog core

指定core文件,可以查看程序是在执行什么语句时coredump的。dbx启动后,如果没有指定core文件,dbx会在当前目录中查看是否有core文件;如果没有就不使用core文件。如果在命令中没有指定progname或corefile,可以在启动后,用givenfile和corefile命令设定。启动dbx时,dbx会在用户目录下查找.dbxinit配置脚本;如果没有找到,则使用系统缺省的设置。在.dbxinit文件中,包含的是一些dbx命令,dbx启动时,首先执行这些命令。例如编辑.dbxinit 文件为:

set $editor = vi

set $lines = 20

alias n next

除了使用.dbxinit来设置dbx外,可以用环境变量DBXINIT来设置选项。dbx会将DBXINIT 插入到命令行选项之前。下面看看部分dbx的命令行任选项:

-I dir指定在dir目录搜索源程序文件。

-c file指定file为启动时执行的命令文件,代替使用.dbxinit文件

-p PID#调试指定进程号为PID的进程。

-p name调试指定名字为name的进程(由ps可以看到)。

3.2.2 dbx命令

进入dbx后就可以交互的使用dbx命令了。下面介绍一些常用的dbx命令:

givenfile [filename]当该命令没有参数时,显示当前调试的程序文件名,当给出filename参数时,读入新的filename程序的符号表,并等待调试。

相关文档
最新文档