c语言是为开发unix系统,UNIX下的C语言开发环境.ppt

《UNIX下的C语言开发环境.ppt》由会员分享,可在线阅读,更多相关《UNIX下的C语言开发环境.ppt(46页珍藏版)》请在人人文库网上搜索。

1、第4章UNIX下的C语言开发环境,1。gcc和gdb,1.1 UNIX和C语言C是在UNIX操作系统早期广泛使用的一种通用编程语言,由贝尔实验室的DennisRitchie为UNIX的辅助开发而编写。c是所有UNIX版本的系统语言。几乎任何计算机都至少有一个可以使用的C编译器;它的语法和函数库在不同的平台上是统一的。20世纪80年代末,美国国家标准协会发布了一个名为ANSIC的C语言标准,它保证了不同平台上C语言的一致性。1.gcc和gdb,1.2 GNU C编译器GNU C编译器(gcc)是一个功能齐全的ANSIC兼容编译器,它是一个C编译器,适用于所有的UNIX系统。Gcc是一个超级编译器。

2、,可以在各种硬件平台上编译可执行程序,其执行效率比一般编译器高200%。1.gcc和gdb,gcc编译过程:预处理,分析包含和预编译语句(如宏定义等)。)在源代码文件中。编译就是把C/C代码“翻译”成汇编代码。汇编:将第二步输出的汇编代码翻译成符合一定格式的机器码,用。o作为后缀。链接,将上一步生成的目标文件与系统库的目标文件和库文件进行链接,最终生成一个可以在特定平台上运行的可执行文件。1。在UNIX下的c语言开发环境下,gcc遵循文件类型的规定。C是后缀文件,C语言源代码文件;带后缀的文件。a是由目标文件组成的归档文件;带后缀的文件。c。抄送或。cxx是一个c源代码文件;带后缀的文件。h是。

3、包含在程序中的头文件;带后缀的文件。我是预处理的C源代码文件;带后缀的文件。ii是预处理的c源代码文件;带后缀的文件。是一个目标代码文件;带后缀的文件。o是编译后的目标文件;带后缀的文件。s是汇编语言源代码文件;带后缀的文件。s是预编译的汇编语言源代码文件。1.gcc的最基本用法:gcc选项文件名选项是编译器所需的参数;文件名给出相关的文件名;/* Hello World . c */#包含Int main(int argc,char *argv)打印f(“你好,世界!n”);返回0;例如:$ gcc hello world.c $。/a.out $您好,世界!1。gcc和gdb,1.4 gc。

4、c选项-墙:允许所有有用的警告;-o:定义输出文件;-c:只编译和生成。o目标文件,无链接;-I:设置头文件的搜索路径;-L:设置库文件的搜索路径;-o:O1、O2、O3、O4和O5的优化水平;-g:用于gdb调试,包括可执行程序中的标准调试信息;-w:关闭所有警告;-E:完成预处理/预编译停止;1。gcc和gdb,-Wall:允许所有有用的警告(建议始终使用此选项),/* bad.c */#包含int main (int argc,char * * argv) printf(“二加二等于% fn”,4);返回0;示例1: $ gcc坏。坏例子2:gcc wall bad。c o坏,1。gcc。

5、和gdb,-o:定义输出文件,例如:编译多个源文件。你好。c-o helloworld,/*您好。h */void hello (constchar *),/* Hello . c */# include # include Hello . h void Hello(const char * name)printf(Hello,%s!n,名称);/* main . c */#包含hello.h int main (int argc,char * * argv)hello(world);返回0;1。gcc和gdb,-c:只编译和生成。o对象文件,无需链接,例如:编译多个源文件$ gcc-wall。

6、-cmain . c $ gcc-wall-cmhello . c $ gcc main . o Hello . o-o Hello world,/* hello.h */void hello (const,/* Hello . c */# include # include Hello . h void Hello(const char * name)printf(Hello,%s!n,名称);/* main . c */#包含hello.h int main (int argc,char * * argv)hello(world);返回0;包含函数定义的目标文件应该出现在任何调用这些函数的。

7、文件之后。1.gcc和gdb,重新编译和重新链接,例如:编译多个源文件$ gcc-wall-c main . c $ gcc main . o hello . o-o hello world,/* hello . h */void hello(const char * name);/* Hello . c */# include # include Hello . h void Hello(const char * name)printf(Hello,%s!n,名称);/* main . c */#包含hello.h int main (int argc,char *argv) hello(“。

8、每个人”);返回0;世界-每个人,1。gcc和gdb,-l:链接外部库文件,它们是已编译并可链接到程序中的目标文件的集合。该库提供了一些最常用的系统函数,如在c的数学库中寻找平方根函数sqrt。库通常存储在带扩展名的特殊档案文件中。”一个“或”。所以。”,C标准库本身存储在“/usr/libc.a”中,它包含ANSI/ISO C标准指定的各种功能,并且是默认自动加载的库。/* sqrt . c */# include # include int main(int argc,char * * argv)double r=sqrt(3.0);(3.0的平方根是%fn,r);返回0;例如:$ gcc。

9、-wallsqrt.c-o sqrt,ccbr6ojm.o3360在函数main : ccbr 6 ojm . o .(text0x 19):未定义的对sqrt的引用,1。gcc和gdb,-l:链接外部库文件,函数sqrt()没有在源程序中定义。为了使编译器能够将sqrt()函数链接到主程序“sqrt.c”,有必要提供“libm.a”库。例如:$ gcc-wall sqrt . c/usr/lib/libm.a-osqrt,/usr/lib/libm . a,-lm,$ gcc-wallsqrt.c-lm-osqrt,编译器选项-lNAME 尝试链接文件名 libNAME.a 1。gcc和gd。

10、b之间的链接顺序,库,原则:包含函数定义的库应该出现在使用该函数的任何源文件和目标文件之后,示例1: $ gcc-wall-lmsqrt.c-osqrt(不正确)$ gcc-wallsqrt.c-lm-osqrt(正确),示例2:$ gcc-wall sqrt.c-lglpk-lm-o sqrt,程序“sqrt . c”使用GNU线性编程库“libglpk.a”,而后者又使用数学库“libm.a”,因此它gcc和gdb,-L:,/usr/local/lib/usr/lib/,示例:$ gcc-wall-l/tmp/lib sqrt . c-lm-o sqrt,-l/tmp/lib,1。gcc和。

11、gdb,-I:设置头文件的搜索路径,如果头文件不在gcc使用的标准包含文件路径中,/usr/local/include/usr/include/,例如:$ gcc-wall-I/tmp/include sqrt . c-lm-o sqrt,-I/tmp/include,1。gcc和gdb,-o: o0,O1,O2,O3,O4操作系统选项选择优化以减小可执行文件大小。其目的是为内存和磁盘空间有限的系统生成尽可能小的可执行文件。大多数情况下,使用“-O0”进行调试,使用“-O2”进行开发和部署就足够了。1。gcc和gdb,一般来说,可执行文件不包含原始程序中源代码的任何引用信息,如变量名或行号可执。

12、行文件只是编译器作为机器代码生成的指令序列。Gcc提供了“-g”调试选项,在目标文件和可执行文件中存储附加调试信息。当跟踪错误时,这些调试信息可以使源代码文件中的行从特定的机器代码指令映射。-g:存储调试信息,1。gcc和gdb,1.5 gdb调试和分析选项gdb基本命令文件加载要调试的可执行文件;Kill终止正在调试的程序;列表列出生成可执行文件的源代码的一部分;接下来执行一行源代码,但不输入函数;步骤执行一行源代码并进入函数;运行执行当前调试的程序;退出终止广发银行。手表使你能够监控一个变量的值,不管它什么时候被改变;Break在代码中设置一个断点,这将使程序在这里执行时挂起;Make使您。

13、能够在不退出gdb的情况下重新生成可执行文件;Shell使您能够在不离开gdb的情况下执行UNIXshell命令。1。gcc和gdb,gdb调试示例,/* gdbtest。c */#包含int sum(int m);int main(int argc,char *argv) int I,n=0;总和(50);对于(I=1;i=501)n=1;printf(“1-50之和为%dn”,n);int sum(int m) int i,n=0;对于(I=1;I=m;I)n=I;printf(“1-m之和为%dn”,n);例如:$ gcc-wall-g gdbtest.c-o gdbtest,1。gcc。

14、和gdb,1。启动gdb开始调试,1。$ gdb gdbtest,2。$ gdb (gdb)文件gdbtest,1。gcc和gdb,2。检查gdb中的源代码。示例:(gdb)列表,也可以缩写为l,1。gcc和gdb3.在gdb中设置断点;例1: (gdb) break9,也可以缩写为b;注意:在gdb中按行号设置断点意味着代码在运行到相应的行号之前被挂起;您可以在gdb中设置多个断点。1。gcc和gdb,3。在gdb中设置断点,示例2: (gdb) breaksum,设置函数断点,示例3:(gdb)break 8 if I=5,设置条件断点,1。gcc和gdb,4。查看断点,示例:(gdb)信。

15、息中断1。gcc和gdb5.运行代码,例如:(gdb) run,也可以缩写为r;1.gcc和gdb6.检查变量,例如:(gdb)打印I,也可以缩写为p;I是变量名,“$N”是当前变量值的引用标记,1。gcc和gdb,7。单步操作可以使用命令“步骤”和“下一步”。它们之间的区别是,如果有函数调用,“step”将进入函数体,但“next”不会进入函数体;8。恢复程序的运行。使用命令“继续”恢复程序的正常运行,直到遇到下一个断点或程序结束;广发银行的程序有三种状态:“运行”、“暂停”和“停止”。在“暂停”状态下,函数的地址、参数和局部变量被推入“堆栈”,因此可以查看函数的各种属性;当功能处于“停止”。

16、状态时,“堆栈”将自动取消,查看功能的信息将不会发送。,2。2.1为什么用make做项目经理?工作量问题:对于有多个(数百个)源文件的软件项目,只需要编写一个编译过程,而不是每次修改源文件后重复输入大量的文件名和编译命令进行编译;效率问题:make可以根据文件的时间戳自动发现更新后的源文件,并通过读取Makefile文件来编译更新后的源文件,同时只链接其他文件。2。make命令,2.2 Makefile格式Makefile是make读入的唯一配置文件。Makefile通常包含以下内容:make要创建的目标通常是目标文件或可执行文件;要创建的目标体所依赖的文件(dependency _ file);创建每个目标实体时要运行的命令。make file format:target : dependency _ file command,命令前必须有一个“tab ”, 2 . make command,2.2 Makefile format,Make file content:main : main . o hello . o gcc main . o hello . o-o main main . o : main . c gcc-wall-c main . c-o main . o hello . o 3360h。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值