linux下C语言使用编译与调试试验
实验1:Linux下C语言编程实践
实验1 linux c语言编程实践一、实验目的1.掌握Linux环境下C程序的编辑、编译、运行等操作;2.掌握多文件的编译及连接;3.初步掌握gdb调试方法;二、实验任务与要求1.在Linux环境下C程序的编辑、编译与运行;2.多文件的编译及连接;3.应用gdb调试程序;三、实验工具与准备计算机PC机,Linux Ubuntu操作系统四、实验步骤与操作指导1.调试下列程序。
程序通过创建一个小型函数库,它包含两个函数,然后在一个示例程序中调用其中一个函数。
这两个函数分别是pro1和pro2。
按下面步骤生成函数库及测试函数库。
步骤1 为两个函数分别创建各自的源文件(将它们分别命名为pro1.c和pro2.c)。
[root@localhost root]# vi pro1.c#include <sdtio.h>void pro1(int arg){printf(“hello:%d\n”,arg) ;}[root@localhost root]# vi pro2.c#include <sdtio.h>void pro2(char *arg){printf(“您好:%s\n”,arg) ;}步骤2 分别编译这两个文件,生成要包含在库文件中的目标文件。
这通过调用带有-c 选项的gcc编译器来实现,-c选项的作用是阻止编译器创建一个完整的程序,gcc将把源程序编译成目标程序,文件名为以.o结尾。
如果此时试图创建一个完整的程序将不会成功,因为还未定义main函数。
[root@localhost root]# gcc -c pro1.c pro2.c[root@localhost root]# ls *.opro1.o pro2.o步骤3 现在编写一个调用pro2函数的程序。
首先,为库文件创建一个头文件lib.h。
这个头文件将声明库文件中的函数,它应该被所有希望使用库文件的应用程序所包含。
操作系统实验1.2C编程与调试-发给学生
实验二C编程与调试(一)实验目的学会和掌握C语言开发一个应用程序的全过程,包括编辑、编译、调试过程。
(二)实验器材linux平台。
(三)实验内容1.使用gcc编译一个示例程序。
方法一:Linux下编写C程序一般要经过的步骤。
(1)启动常用的编辑器,输入C源程序代码。
在自己的主文件夹下,右击-“创建文档”-“空文档”,或者单击“主菜单”-“附件”-“文本编辑器”,进入文本编辑环境,输入C源程序,保存并命名为hello.c。
注:如果是复制代码的话,要改“”符号的格式,否则会报错。
#include<stdio.h>int main(void){printf(“Hello world!\n”);return 0;}(2)编译源程序。
在自己的主文件夹下,单击“主菜单”-“系统工具”-终端,进入命令行。
用GCC编译器对C源程序进行编译,以生成一个可执行文件。
方法如下:gcc -o hello hello.c运行程序,输入如下命令:./hello方法二:编译过程分成几个步骤单独进行,并观察每步的运行结果。
(1)预处理阶段,使用-E参数可以让GCC在预处理结束后停止编译过程:gcc -E hello.c -o hello.i预处理结束后,stdio.h的内容将插入到文件里,其他当被预处理的宏定义也都做了相应的处理。
(2)编译阶段gcc -S hello.i -o hello.s上述命令将代码翻译成汇编语言。
(3)汇编阶段,将生成的.s文件转成.O的二进制目标文件。
gcc -c hello.s -o hello.o(4)连接阶段在成功编译后,就进入了连接阶段。
gcc hello.o -o hello完成连接后,gcc就可以生成可执行文件,运行程序,输入如下命令:./hello如果整个程序是由多个源文件组成的,相应地也就形成了多个编译单元。
假设有一个由foo1.c和foo2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序foo,可以使用下面这条命令:gcc foo1.c foo2.c -o foogcc总体选项列表后缀名所对应的语言-c 只是编译不链接,生成目标文件“.o”-S 只是编译不汇编,生成汇编代码-E 只进行预编译,不做其他处理-g 在可执行程序中包含标准调试信息-o file 把输出文件输出到file里-v 打印出编译器内部编译各过程的命令行信息和编译器的版本-I dir 在头文件的搜索路径列表中添加dir目录-L dir 在库文件的搜索路径列表中添加dir目录-static 链接静态库-llibrary 连接名为library的库文件2.使用gcc发现程序错误。
深圳大学Linux上C程序编译,调试和工程文件管理 实验报告,你懂的 (1)
深圳大学实验报告课程名称:Linux操作系统实验项目名称:Linux上C程序编译,调试和工程文件管理学院:计算机与软件学院专业:软件工程指导教师:冯禹洪报告人:学号:班级:实验时间:2014/12/26实验报告提交时间:2014/12/27教务处制一、实验目标:熟悉Linux上C程序设计环境,包括以下内容:1. 联机帮助man命令2. 编译工具gcc的使用3. 熟悉使用gdb来调试程序4. 熟悉C工程文件的管理工具makefile二、实验环境与工件湖边Linux实验室Fedora 13三、实验内容与步骤1.动态库函数可以在多个应用程序之间共享,可以减少应用程序文件的容量和应用程序的装载时间。
因此,熟悉构建动态库可以提高软件的编写质量。
请跟随以下步骤构建动态库message,并用其编写程序、编译和运行。
(40分)1.1编写源程序message.c(见图1)和main.c(见图2)图1. message.c源程序图2.main.c源程序1.2用以下命令对message.c进行编译,其中,“-fPIC”选项是告诉gcc产生的代码不要包含对函数和变量具体内存位置的引用。
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
1.3以上命令将获得目标文件message.o,使用以下命令建立共享函数库message:1.4使用1.3获得的共享函数库来编译main.c文件1.5设置共享函数库搜索路径1.6运行程序并附上结果1.7构建静态可执行程序1.7.1$gcc –c message.c1.7.2$ar –crv libmsg.a message.o1.7.3$gcc –o main main.c –L./ -lmsg1.7.4$./main注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
1.8 运行以下两个命令并截图说明结果:$ldd goodbye $ldd main$ls –l goodbye main答:main和goodbye的不同点在于代码被载入的时刻不同。
基于Linux操作系统的C语言编译和调试方法解析
基于Linux操作系统的C语言编译和调试方法解析摘要:文章先介绍了GCC编译器相关内容,包括GCC编译程序和GCC编译选项,随后介绍了GDB调试程序相关内容,包括GDB具体操作和GDB基础命令,最后介绍了C语言编写中的注意事项,希望能给相关人士提供有效参考。
关键词:Linux操作系统;C语言编译;调试方法引言:C语言拥有较强的表达能力、应用范围较广、功能丰富,同时目标程序的运行效率相对较高,拥有良好的可移植性,不但拥有高级语言应用优势,同时还兼具低语言特征。
为此C语言也是当下推广速度最快的计算机语言。
一、GCC编译器(一)GCC编译程序Linux OS系统中应用的C编译器主要是GCC编译器,如果初步了解其他控制系统中的某种C编译器,则便会快速掌握GCC操作。
结合相关编辑软件编制完成某一C语言源程序后,会直接进入下面几项环节,分别是程序运行、连接、开展编译工作、程序输入等。
比如在设计C源程序的filel.c时,通过编译后可以或得filel.o的目标文件,并和系统中的库函数实施有效连接,最终获得filel.out可执行文件,并开始启动filel.out文件运行。
GCC编译器执行命令的具体用法如下所示:GCC[选项][文件名]GCC编译程序中如果不存在任何选项的条件下,便会自动生成一种a.out可执行文件,比如以下命令会在现有目录下生成一种称作a.out的文件,相关文件名为gcc filel.c。
如果想要改变系统默认文件名a.out,在开展编译工作中相关技术人员可以自主指定相应的可执行文件名,从而对系统自动生成的a.out文件实施有效替换,比如可以把filel.c名字的C程序改编为filel.out名字的可执行文件,并按照下方命令参考输入:gcc-o filel.out filel.c。
操作中需要注意应用-0选项过程中,后面应该紧跟一种文件名[1]。
(二)GCC编译选项GCC编译选项多种多样,其中仅有少部分会频繁选用,除了相关选项之外,还包含各种不会经常应用的选项,为此可以输入man gcc,并查阅其应用方法。
Linux下C语言程序的编译与调试实验报告
Linux下C语言程序的编译调试实验学院:电子信息工程学院专业:通信工程*名:***学号:********指导老师:周围老师完成时间:2013年6月3日一、实验目的1. 熟悉Linux下C语言编译调试环境。
2. 学会使用gcc编译C程序。
3. 学会使用gdb调试C程序。
二、实验内容1. 在Linux下,编写程序factorize.c,功能如下:输入一个int型整数,输出其因式分解结果。
2. 编译运行,生成可执行文件。
3. 用gdb调试该程序,找到错误并修改。
三、实验软件环境GCCGCC(GNU Compiler Collection,GNU编译器集合)是一套由GNU工程开发的支持多种编程语言的编译器。
GCC是自由软件发展过程中的著名例子,由自由软件基金会以GPL协议发布。
GCC是大多数类Unix操作系统(如Linux、BSD、Mac OS X等)的标准的编译器,GCC同样适用于微软的Windows。
GCC支持多种计算机体系芯片,如x86、ARM,并已移植到其他多种硬件平台。
GCC原名为GNU C编译器(GNU C Compiler),因为它原本只能处理C语言。
GCC很快地扩展,并支持处理C++。
后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go等。
GDBGDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。
或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。
所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮助你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。
(断点可以是条件表达式)。
3、当程序被停住时,可以检查此时你的程序中所发生的事。
第三讲:Linux下C程序编译和调试20100314
• • • •
汇文教育
HUIWEN EDUCATION
GDB调试器的使用
以下程序是汉诺塔的源程序:
#include "stdio.h" main() { void hanoi(int,char,char,char); int m; printf("input the number of disks:"); scanf("%d",&m); printf("The step to moving %d disks:\n",m); hanoi(m,'A','B','C'); } void hanoi(int n,char a,char b,char c) { void move(char,char); if(n==1) move(a,c); else { hanoi(n-1,a,c,b); move(a,c); hanoi(n-1,b,a,c); } } void move(char x,char y) { printf("%c-->%c\n",x,y); }
游戏规则: For a cell that is ‘alive': 1, Each cell with one or no neighbors dies, as if by loneliness. 2, Each cell with four or more neighbors dies, as if by overpopulation. 3, Each cell with two or three neighbors survives. For a cell that is ‘dead' 4, Each cell with three neighbors becomes alive.
实验4:Linux C语言编程和调试
pro1.o pro2.o步骤3 现在编写一个调用pro2函数的程序。
首先,为库文件创建一个头文件lib.h。
这个头文件将声明库文件中的函数,它应该被所有希望使用库文件的应用程序所包含。
[root@localhost root]# vi lib.h/*lib.h:pro1.c,pro2.c*/void pro1(int);void pro2(char *);步骤4 创建主程序program.c,它包含库的头文件并且调用库中的一个函数。
[root@localhost root]# cat program.c#include “lib.h”int main(){pro2(“Linux world”);exit(0);}步骤5 编译并测试程序。
暂时为编译器显式指定目标文件,然后要求编译器编译文件并将其与预先编译好的目标模块pro2.o链接。
[root@localhost root]# gcc -c program.c[root@localhost root]# gcc -o program program.o pro2.o[root@localhost root]# ./program您好:Linux world步骤6 创建并使用一个库文件。
用ar程序创建一个归档文件并将目标文件添加进去。
这个程序之所以称为ar,是因为它将若干单独的文件归并到一个大的文件中以创建归档文件。
注意,也可以用ar程序来创建任何类型文件的归档文件。
[root@localhost root]# ar crv libfoo.a pro1.o pro2.o函数库现在即可使用。
可以在编译器命令行的文件列表中添加该库文件以创建程序,如下所示:[root@localhost root]# gcc -o program program.o libfoo.a[root@localhost root]# ./program您好:Linux world也可以用“-l”选项来访问函数库,但是因为其未保存在标准位置,所以必须用-L选项来指示gcc在何处可以找到它,如下所示:[root@localhost root]#gcc -o program program.o -L. -lfoo-L.选项指示编译器在当前目录“.”中查找函数库。
实验4:Linux C语言编程和调试
实验4:Linux C语言编程和调试实验4:linuxc语言编程和调试实验报告4课程名称:linux基础实验名称:linuxc语言编程和调试学生姓名:班级:学号:指导老师:钱振江成绩:一、实验目的1.掌控linux环境之下c程序的编辑、编程、运转等操作方式;2.掌控多文件的编程及相连接;3.初步掌控gdb调试方法;二、实验任务与要求1.在linux环境之下c程序的编辑、编程与运转;2.多文件的编程及相连接;3.应用领域gdb调试程序;4.随机数的应用领域;三、实验工具与准备计算机pc机,linuxubuntu操作系统四、实验步骤与操作指导1.调试以下程序。
程序通过建立一个小型函数库,它涵盖两个函数,然后在一个示例程序中调用其中一个函数。
这两个函数分别就是pro1和pro2。
按下面步骤分解成函数库及测试函数库。
步骤1为两个函数分别创建各自的源文件(将它们分别命名为pro1.c和pro2.c)。
[root@localhostroot]#vipro1.c#includevoidpro1(intarg){printf(“hello:%d\\n”,arg);}[root@localhostroot]#vipro2.c#includevoidpro2(char*arg){printf(“您好:%s\\n”,arg);}步骤2分别编译这两个文件,生成要包含在库文件中的目标文件。
这通过调用带有-c选项的gcc编译器来实现,-c选项的作用是阻止编译器创建一个完整的程序,gcc将把源程序编译成目标程序,文件名为以.o结尾。
如果此时试图创建一个完整的程序将不会成功,因为还未定义main函数。
[root@localhostroot]#gcc-cpro1.cpro2.c[root@localhostroot]#ls*.o1pro1.opro2.o步骤3现在编写一个调用pro2函数的程序。
首先,为库文件创建一个头文件lib.h。
实验一linux常用命令linux下c语言使用、编译与调试实验
实验一:Linux常用命令、C语言使用、编译与调试实验内容:1、熟悉LINUX用户界面及常规设置。
2、熟悉LINUX 的常用基本命令如ls、who、w、pwd、ps、pstree、top 等。
3、用vi 编写一个简单的、显示"Hello,World!"的C 程序,用cc 编译并观察编译后的结果4、利用cc 调试该程序5、运行生成的可执行文件。
要求:1、了解Linux的命令及使用格式。
2、练习并掌握LINUX 提供的vi 编辑器来编译C 程序3、学会利用gcc(cc)编译、调试C 程序主要仪器:装有Linux系统的微机实验步骤:一、Linux命令Linux文件的复制、删除和移动命令cp命令、mv命令Linux目录的创建与删除命令mkdir命令、rmdir 命令、cd 命令、pwd 命令、ls 命令Linux文本处理命令sort命令、uniq命令Linux备份与压缩命令tar命令、gzip命令、unzip命令Linux与用户有关的命令passwd命令、su命令Linux系统管理命令wall命令、write命令、mesg指令、free命令Linux磁盘管理df命令、du命令、dd命令、fdformat 命令、echo命令、cal命令、date命令clear命令二、Linux下C语言使用、编译与调试实验输入vi helloworld.c进入编辑器按i 进入插入模式输入#include<stdio.h>int main(){printf("HelloWorld!\n");}按esc 输入:wq后回车完成编辑输入gcc -o helloworld helloworld.c然后输入./helloworld可查看程序运行的结果。
实验结果:。
Linux 下C程序编译上机实验报告
辽宁工程技术大学上机实验报告成绩课程名称Linux程序设计实验题目实验2 Linux下C程序编译院系软件学院专业嵌入式软件工程班级09-2班姓名王翀学号0920010214实验日期2012-4-22实验目的1、熟悉嵌入式Linux系统(Red Hat)及集成开发环境;含交叉编译器arm-linux-gcc,并配置环境;2、熟悉Linux下的编辑器(vim),编译器(gcc),调试器(GDB);3、通过饱含多文件的makefile的编写,熟悉各种形式的makefile,并进一步加深对makefile中用户自定义变量、自动变量及预定义变量的理解。
实验准备1、装有虚拟机(VMware Workstation)和嵌入式Linux系统(Red Hat 9)的PC 机一台;2、XSBase270实验开发平台一套;3、认真阅读教材第二章节内容,练习课后2.7.3实验内容。
实验进度本次共有 2 个练习,完成 2 个。
实验内容【实验原理】(1)Makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).创建程序(make程序)首先读取Makefile文件,然后再激活编译器,汇编器,资源编译器和连接器以便产生最后的输出,最后输出并生成的通常是可执行文件.创建程序利用内置的推理规则来激活编译器,以便通过对特定cpp文件的编译来产生特定的obj文件。
(2)交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。
这种方法在异平台移植和嵌入式开发时非常有用。
实际上,GNU make工具通过一个称为Makefile的文件来完成对应用程序的自动维护和编译工作。
实验二《Linux平台下C语言实验》
查看变量值
在gdb中输入“p变量名”可以查看该变量的值。
gdb在显示变量值时都会在对应值前加“$n”标记,它是当前变量值的引用标记,以后想再用此变量,可以直接使用“$n”,提高调试效率。
继续运行程序
继续运行结果
变量y的值为1,但是最后输出的结果却为0,说明错误出在“%d”上,查看源代码,发现y为float型,而%d对应得是int型。
a.实验步骤
步骤1:编辑源程序代码
步骤2:输入程序代码
步骤3:编译程序
步骤4:运行程序
b.查看执行结果
程序的执行结果。
2.程序错误查找及调试
例6.用递归方法求n!。
a.实验步骤
步骤1:编辑源程序代码
步骤2:输入程序代码
步骤3:编译程序
步骤4:运行程序
程序执行结果
很明显,以上运行结果是不正确的。
步骤5:用gdb进行调试
步骤3:编译程序
编译结果:
步骤4:加“-lm”参数编译程序
步骤5:运行程序
b.查看执行结果
程序的执行结果
例3.输入学生成绩,要求输出成绩等级。90分以上为‘A’,80~90为‘B’,70~79为‘C’,60~69为‘D’,60以下为‘E’。
a.实验步骤
步骤1:编辑源程序代码
步骤2:输入程序代码
步骤3:编译程序
2.学会用vi编辑器在创建的文件里写程序源代码,感觉不足之处是编辑环境不是很好,比较复杂。在编辑源代码无错误后用GCC命令进行编译,生成可执行文件。在编译没有出错后,用./+文件名,运行该程序。
3.虽然在Linux下编程没有一些IDE开发环境,但也有其优势,那就是你不必学会使用很多的IDE,用Vi编辑器可以完成基本所有的程序编辑。另外一个优势也是最重要的优势:Linux内核是开源的,你可以看到程序在运行时的任何信息,这是其他平台所不具有的。使用Linux,你手中的整个操作系统,包括支持你运行C语言的一切工具的源代码,都是对你公开的。
实验2 Linux下C语言程序的编译与调试
6. 启动 Gdb 调试:gdb greet。 7. 查看源代码,使用命令“l”。 8. 在 23 行(for 循环处)设置断点,使用命令“b 23”。 9. 在 26 行(printf 函数处)设置断点,使用命令“b 26”。 10.查看断点设置情况,使用命令“info b”。 11.运行代码,使用命令“r”。 12.单步运行代码,使用命令“n” 13.查看暂停点变量值,使用命令“p string2[size - i]”。 14.继续单步运行代码数次,并使用命令查看,发现 string2[size-1]的值正确。 15.继续程序的运行,使用命令“c”。 16.程序在 printf 前停止运行,此时依次查看 string2[0]、string2[1]„,发现
实验 2 Linux 下 C 语言程序的编译与调试
一、实验内盘上输入 4 个整数,找出其中最大的整数的程序,用 gcc/g++ 编译并观察编译后的结果。
2. 用 gdb 调试该程序。 3. 运行生成可执行文件。
二、实验目的:
1. 练习 Vi 编辑器来编译 C 程序。 2. 学会使用 gcc/g++编译、gdb 调试 C 程序。
四、实验分析
为了使 GDB 正常工作,必须使程序在编译时包含调试信息。调试信息里包含程 序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。GDB 利用这 些信息使源代码和机器码相关联。所以在编译时用-g 选项打开调试选项。
GCC 命令的基本用法:gcc [options] [filename] -o 选项为即将产生的可执行文件指定一个文件名来代替默认的 a.out。 GDB 是一个用来调试 C 和 C++程序的强有力的调试器。它使用户能在程序运行 时观察程序的内部结构和内存的使用情况。
1.9 linux下c程序的调试和编译
调试器gdb
• 编译: gcc -o greeting greeting.c 显示如下结果: The string is hello there The string printed backward is 所设想的输出应该是: The string printed backward is ereht olleh
16
练习
1、键入vi,编辑一个新文件exam.c。其内容如下: #include <stdio.h> main() { int a,i=0; a=0; while(i<10) { a=a+2; printf("the value of a=%d \n",a); sleep(1); i=i+1; } }
17
练习
• 2、保存退出exam.c
– 编译exam.c 。 • 使用 gcc -o exam.o exam.c • 使用 gcc - g -o gexam.o exam.c • 比较gexam.o 与 exam.o的大小 • 执行exam.o 键入 ./exam.o 。这里./表示当前目录 • 执行gexam.o 键入 ./gexam.o。
7
目录
gcc编译器 调试器gdb
8
调试器gdb
Linux 包含了一个叫gdb 的GNU 调试程序。gdb 是一个用来 调试C 和C程序的强力调试器。它使你能在程序运行时观 察程序的内部结构和内存的使用情况。gdb 功能非常强 大,适用于修复程序代码中的问题。 • • • • 查看程序的内部结构 打印变量值 可设置断点以使程序在指定的代码行上停止执行 单步调试源代码
18
练习
• 3、利用gdb调试exam.c。 • 4、利用屏幕输出字符(printf())调试exam.c。
Linux环境下C语言编程实验报告
Linux环境下C语言编程实验报告Xi邮电大学(计算机学院)课堂实验报告实验名称:Linux环境下的C语言编程专业名称:网络工程班(3)掌握gdb调试方法2,实验内容1。
编辑测试源代码2.gcc编译测试源代码3。
gdb调试和调试3.实验步骤1。
编辑以下参考源代码。
该代码的初衷是以相反的顺序输出主函数中定义的字符串# include int display 1(char * string)。
int display 2(char *字符串);p I int main(){字符字符串[] = \nWelcom到Linux\display1(字符串);display2(字符串);}int display 1(char * string){printf(\ }int display 2(char * string 1){char * string 2;int大小,I;size = strlen(string 1);string 2 =(char *)malloc(size+1);对于(I = 0;I printf(\ }2。
使用gcc将参考源代码编译成可执行文件3.运行可执行文件,观察运行结果并记录下来4。
使用gdb调试器找出错误的原因,并通过设置断点和单步跟踪进行记录。
5.纠正错误,修改参考源代码并记录下来6。
使用gcc将参考源代码编译成可执行文件,观察运行结果并记录下来4.实验部分5的截图和描述,总结了Gcc和gdb确实是很好的工具,但是有些命令在的时候没有清晰的记忆,不能完全掌握,真正的魅力无法实现,还有很多参数需要在以后的实践中进一步研究。
我希望将来能继续经历这些。
gcc和gdb确实非常实用。
使用这些东西可以大大提高效率,特别是gdb和gdb。
Linux下编译与调试
LINUX下编译与调试1.gcc/g++编译器对于.c格式的C文件,可以采用gcc或g++编译对于.cc、.cpp格式的C++文件,应该采用g++进行编译常用的选项:-c 表示编译源文件-o 表示输出目标文件-g 表示在目标文件中产生调试信息,用于gdb调试-D<宏定义> 编译时将宏定义传入进去-Wall 打开所有类型的警告。
1. gcc编译过程:预编译→编译→汇编→链接当我们进行编译的时候,要使用一系列的工具,我们称之为工具链.其中包括:预处理器,编译,汇编器as,连接器. 一个编译过程包括下面几个阶段:(1)预处理:预处理器将对源文件中的宏进行展开。
(2)编译:gcc将c文件编译成汇编文件。
(3)汇编:as将汇编文件编译成机器码。
(4)链接:将目标文件和外部符号进行连接,得到一个可执行二进制文件。
下面以一个很简单的test.c来探讨这个过程。
#include <stdio.h>#define NUMBER (1+2)int main(){int x = NUMBER;return 0;}(1)预处理:gcc –E test.c -o test.i 我们用cat查看test.i的内容如下:int main() int x=(1+2); return 0;我们可以看到,文件中宏定义NUMBER出现的位置被(1+2)替换掉了,其它的内容保持不变。
(2)编译:gcc -S test.i –o test.s 通过cat test.s查看test.s的内容为汇编代码。
(3)汇编:as test.s -o test.o 利用as将汇编文件编译成机器码。
得到输出文件为test.o. test.o中为目标机器上的二进制文件. 用nm查看文件中的符号:nm test.o输出如下:00000000 T main。
有的编译器上会显示:00000000 b .bss 00000000 d .data 00000000 t .text U ___main U __alloca 00000000 T _main既然已经是二进制目标文件了,能不能执行呢?试一下./test.o,提示cannotexecute binary file.原来___main前面的U表示这个符号的地址还没有定下来,T表示这个符号属于代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
撤消
·
重做
2、GNU C编译器
1)使用gcc
通常后跟一些选项和文件名来使用gcc编译器。gcc命令的基本用法如下:
gcc [options] []
命令行选项指定的编译过程中的具体操作
2) gcc常用选项
当不用任何选项编译一个程序时,gcc将建立(假定编译成功)一个名为a.out的可执行文件。
选项含义:
{ห้องสมุดไป่ตู้
printf("Usage:pow base exponent\n");
exit(1);
}
res = mypow(x, y);
printf("%u ^ %u = %u\n", x, y, res);
return 0;
}
编译过程:
# gcc -c mypow.c
# ar rcsv libpow.a mypow.o
此时得到的可执行文件就不再是a.out,而是count。
-c GCC仅把源代码编译为目标代码。默认时GCC建立的目标代码文件有一个.o的
扩展名。
-E对文件进行预处理
-S对文件进行编译,生成汇编代码。
-O对源代码进行基本优化。这些优化在大多数情况下都会使程序执行得更快。
-g在可执行程序中包含标准调试信息。
-Wall允许发出GCC能提供的所有有用的警告,也可以用-W(warning)来标识指定的
警告。
-lname链接静态库
-Ldir库文件的搜索路径
3)执行文件
格式:./可执行文件名
例:
# ./a.out
# ./count
4)例子
mypow.c:定义mypow()函数
unsigned long long mypow(unsigned int x, unsigned int y)
a - mypow.o
# gcc -o powtest powtest.c -L. -lpow
# ./powtest
Usage:pow base exponent
# ./powtest 2 10
2 ^ 10 = 1024
3、gdb调试工具
1)调试编译代码
为了使gdb正常工作,必须使你的程序在编译时包含调试信息。调试信息里包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联。
三、操作
1、文件编辑器vi
进入vi,直接执行vi编辑程序。
例:#vitest.c
显示器出现vi的编辑窗口,同时vi会将文件复制一份至缓冲区(buffer)。vi先对缓冲区的文件进行编辑,保留在磁盘中的文件则不变。编辑完成后,使用者可决定是否要取代原来旧有的文件。
1)vi的工作模式
(1)输入模式
输入以下命令即可进入vi输入模式:
实验四:LINUX下C语言使用、编译与调试实验
一、目的:
1、练习并掌握Linux提供的vi编辑器来编译C程序
2、学会利用gcc、gdb编译、调试C程序
3、学会使用make工具
二、内容
1、编写C语言程序,用gcc编译并观察编译后的结果,运行生成的可执行文件。
2、利用gdb调试程序。
3、学习编写makefile,并进行编译。
a
在光标之后加入资料
A
在该行之末加入资料
i
在光标之前加入资料
I
在该行之首加入资料
o
新增一行于该行之下
O
新增一行于该行之上
(2)命令模式
在输入模式下,按ESC可切换到命令模式。命令模式下,可选用下列指令离开vi:
:q!
离开vi,并放弃刚在缓冲区内编辑的内容
:wq
将缓冲区内的资料写入磁盘中,并离开vi
ZZ
-o FILE指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE没
有指定,默认文件名是a.out.
例如,
#gcc test.c
编译成功后,当前目录下就产生了一个a.out文件。
也可用-o选项来为即将产生的可执行文件指定一个文件名来代替a.out。
例如:
#gcc –o count count.c
M
移至窗口中间那一行
L
移至窗口的最后一行
G
移至该文件的最后一行
W,w
下一个单词(W忽略符号)
B,b
上一个单词(B忽略符号)
(4)命令模式下的编辑命令
dd
删除当前光标所在行
yy
复制当前光标所在行
p
将复制的内容粘贴在光标所在的位置后
P
将复制的内容粘贴在光标所在的位置前
x
删除当前光标字符
X
删除当前光标之前字符
{
unsigned long long res=1;
if (y==0)
res = 1;
else if (y==1)
res = x;
else
res = x * mypow(x, y-1);
return res;
}
powtest.c:调用mypow()函数
#include <stdio.h>
#include <stdlib.h>
同wq
:x
同wq
:w
将缓冲区内的资料写入磁盘中,但并不离开vi
:q
离开vi,若文件被修改过,则要被要求确认是否放弃修改的内容,此指令可与:w配合使用
(3)命令模式下光标的移动
h
左移一个字符
j
下移一个字符
k
上移一个字符
l
右移一个字符
0(零)
移至该行的行首
$
移至该行的行尾
^
移至该行的第一个字符处
H
移至窗口的第一行
break
在代码里设置断点,使程序执行到这里时被挂起
make
不退出gdb就可以重新产生可执行文件
shell
不离开gdb就执行UNIXshell命令
3)调试程序
(1)源程序gdbtest1.c,分析程序的功能,如果出错,要求用gdb进行调试并给出修改方案。
基本步骤:
编译:gcc -g-ogdbtest1gdbtest1.c
运行:./gdbtest1
开始调试:gdbgdbtest1
#include <stdio.h>
int add_range(int low, int high)
int main(int argc, char *argv[])
{
unsigned int x, y;
unsigned long long res;
if ((argc<3) || (sscanf(argv[1], "%u", &x)) != 1 || (sscanf(argv[2], "%u", &y)) != 1 )
在编译时用–g选项打开调试选项。
2)gdb基本命令
命令
描述
file
装入欲调试的可执行文件
kill
终止正在调试的程序
list
列出产生执行文件的源代码部分
next
执行一行源代码但不进入函数内部
step
执行一行源代码并进入函数内部
run
执行当前被调试的程序
quit
终止gdb
watch
监视一个变量的值而不管它何时被改变