Linu系统编程实验gccgdb的使用以及Makefile文件的编写
- 格式:docx
- 大小:33.62 KB
- 文档页数:10
实验二:gcc、gdb、Makefile的使用●实验目的:(一)学会使用gcc编译器(二)学会gdb调试器的使用(三)学会编写Makefile●实验要求:(一)编写一应用程序,使用gcc进行编译,并分别使用-o,-g,-static,-O2等选项(二)编写一应用程序,使用gdb调试,调试中使用到该小节所介绍的所有命令(三)实现一应用程序,该程序有两个c文件构成,使用makefile来完成对该程序的编译●实验器材:软件:安装了Linux的vmware虚拟机硬件:PC机一台●实验步骤:(一)gcc编译器1、先用vi编辑hello.c文件,内容如下:2、gcc指令的一般格式为:gcc [选项] 要编译的文件 [选项] [目标文件]例:使用gcc编译命令,编译hello.c生成可执行文件hello,并运行hello上面的命令一步由.c文件生成了可执行文件,将gcc的四个编译流程:预处理、编译、汇编、连接一步完成,下面将介绍四个流程分别做了什么工作3、-E选项的作用:只进行预处理,不做其他处理。
例:只对hello.c文件进行预处理,生成文件hello.i,并查看通过查看可以看到头文件包含部分代码#include <stdio.h>经过预处理阶段之后,编译器已将stdio.h的内容贴了进来。
4、-S选项的使用-S选项的作用:只是编译不汇编,生成汇编代码例:将hello.i文件只进行编译而不进行汇编,生成汇编代码hello.s5、-c选项的使用-c选项的作用:只是编译不连接,生成目标文件.o例:将汇编代码hello.s只编译不链接成hello.o文件6、将编译好的hello.o链接库,生成可执行文件hello7、-static选项的使用-static选项的作用:链接静态库例:比较hello.c连接动态库生成的可执行文件hello和链接静态库生成的可执行文件hello1的大小可以看到静态链接库的可执行文件hello1比动态链接库的可执行文件hello要大的多,他们的执行效果是一样的8、-g选项的使用-g选项的作用:在可执行程序中包含标准调试信息例:将hello.c编译成包含标准调试信息的可执行文件hello2带有标准调试信息的可执行文件可以使用gdb调试器进行调试,以便找出逻辑错误9、-O2选项的使用-O2选项的作用:完成程序的优化工作例:将hello.c用O2优化选项编译成可执行文件hello3,和正常编译产生的可执行文件hello进行比较(二)gdb调试器1、先用vi编辑文件test.c用于gdb调试器调试,内容如下#include <stdio.h>int main(void){int sum(int sum);int i,result=0;sum(100);for(i=1;i<=100;i++){result+=i;}printf("The sum in main function is %d\n",result);return 0;}int sum(int num){int i,n=0;for(i=0;i<=num;i++){n+=i;}printf("The sum in sum function is %d\n",n);}2、将test.c文件编译成包含标准调试信息的文件test3、启动gdb进行调试可以看到gdb启动界面中显示了gdb的版本、自由软件等信息,然后进入了有”gdb”开头的命令行界面4、l(list)命令l命令用于查看文件可以看到每行代码面前都有对应的行号,这样方便我们设置断点。
linux的gcc使用方法Linux是一种开源的操作系统,广泛应用于服务器和嵌入式系统中。
而GCC(GNU Compiler Collection)是Linux下最常用的编译器套件之一,用于将源代码编译成可执行文件。
本文将介绍GCC的使用方法,帮助读者快速上手。
一、安装GCC在Linux系统中,默认情况下已经安装了GCC。
可以通过运行以下命令来验证是否已经安装了GCC:```gcc --version```如果GCC已经安装,则会显示GCC的版本信息;如果没有安装,则可以通过运行以下命令来安装GCC:```sudo apt-get install gcc```二、编写源代码在使用GCC之前,我们需要先编写源代码。
可以使用任何文本编辑器创建一个以.c为后缀的源文件,例如hello.c。
下面是一个示例的源代码:```c#include <stdio.h>int main() {printf("Hello, world!\n");return 0;}```三、编译源代码编写完源代码后,我们可以使用GCC来将其编译成可执行文件。
在终端中运行以下命令:```gcc -o hello hello.c```其中,-o参数用于指定编译后生成的可执行文件的名称,hello为示例的可执行文件名,hello.c为源代码文件名。
如果编译成功,GCC将会生成一个名为hello的可执行文件。
四、运行可执行文件在编译成功后,我们可以通过以下命令来运行可执行文件:```./hello```如果一切顺利,终端将会输出"Hello, world!"的字符串。
五、GCC的其他常用选项除了上述基本的使用方法外,GCC还提供了许多其他的选项,用于控制编译过程的行为。
以下是一些常用的选项:- -Wall:开启所有警告信息的显示。
- -g:生成供调试器使用的调试信息。
- -O2:进行优化处理,提高程序执行效率。
实验二GCC 及GDB的使用一、实验目的和要求a)掌握VI编译环境。
b)掌握GCC编译命令。
c)掌握多个文件共同编译方法。
d)掌握GDB调试命令。
二、实验内容和原理(可参照课件第五章)a)在VI编辑器里编写简单的“hello,world,I am 13050141XX XXX”,利用GCC编译为可执行文件,执行,观察运行结果。
b)在VI编辑器里编写多个文件(至少两个,其中一个为主程序,一个为需要调用的子程序),为其书写头文件,共同编译为可执行文件,执行,观察运行结果。
学习书写MAKEFILE文件,编译,执行,观察结果。
c)编写循环结构的程序,利用GCC 编译(加参数-g)为可执行文件,利用GDB调试,学习GDB调试命令。
三、实验环境a)硬件:PC机b)软件:LINUX操作系统、虚拟机四、实验步骤vi hello.c i:C语言编程Esc :wq gcc hello.c gdb file a.out run a实验三交叉编译环境配置一、实验目的和要求熟悉 Linux 开发环境,学会基于S3C2410 的Linux 开发环境的配置和使用。
使用Linux 的armv4l-unknown-linux-gcc 编译,使用基于NFS 方式的下载调试,了解嵌入式开发的基本过程。
二、实验内容a)配置网络,包括配置IP 地址、NFS 服务、防火墙。
b)安装交叉编译器c)配置超级终端,下载文件到目标机上。
三、实验设备及工具(包括软件调试工具)硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机Pentium 500 以上, 硬盘10G 以上。
软件:REDHAT LINUX 9.0+超级终端+ARM-LINUX 开发环境四、实验步骤(所有的内容截图)1、虚拟机设置为桥接模式。
2、配置IP地址,设置为192.168.0.xxx参照实验指导书图1.4.1-1.4.3. 自己截图,说明3、关闭防火墙,参照实验指导书图1.4.4自己截图,说明4、打开桌面超级终端(HyperTerminal),配置COM1,115200波特率,8N1,实验箱插上电源线,网线与主机相连,串口线与主机串口1相连,开机,看bootloader程序VIVI是否自动加载,回车后进入命令提示符。
linuxgcc命令及用法Linux的gcc命令是一款非常强大的编译器,用于将源代码转换为可执行文件。
本文将详细介绍gcc命令及其常用的用法,帮助读者更好地理解和使用这款工具。
一、gcc命令的基本语法结构gcc是GNU Compiler Collection(GNU编译器集合)的简称,因此其命令基本语法结构一般为:shellgcc [选项] [输入文件]其中,选项用于指定编译时的相关参数,输入文件则是需要编译的源文件。
二、gcc命令的常用选项gcc命令提供了许多选项,用于控制编译过程及生成的可执行文件的属性。
下面是一些常用的gcc选项及其作用:1. -o:用于指定输出文件的名称。
例如,使用`-o myprogram`选项将输出文件命名为myprogram。
2. -c:仅进行编译,不进行链接操作。
这个选项常用于编译多个源文件时,先将每个源文件编译为目标文件,再进行链接操作。
3. -g:生成调试信息。
这个选项会在编译时生成与调试器兼容的调试信息,方便开发人员进行程序调试。
4. -Wall:显示所有警告信息。
使用这个选项可以使编译器在编译时输出更多的警告信息,帮助开发人员提前发现潜在的问题。
5. -I:指定头文件的搜索路径。
使用这个选项可以告诉编译器在指定的路径中查找头文件,方便引用外部库、模块等。
6. -L:指定库文件的搜索路径。
与-I选项类似,这个选项用于告诉编译器在指定的路径中查找库文件,用于链接时的库文件搜索。
7. -l:指定要链接的库文件。
使用这个选项可以显式地告诉编译器要链接的库文件,如:-lmath将链接math库文件。
三、gcc命令的应用实例下面通过几个实例来演示gcc命令的具体用法,以帮助读者更好地理解和掌握这款工具。
1. 编译单个源文件并生成可执行文件假设我们有一个名为`hello.c`的源文件,内容如下:c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}我们可以使用以下命令将其编译为可执行文件`hello`:shellgcc -o hello hello.c编译成功后,即可在当前目录下生成名为`hello`的可执行文件。
makefile编译流程Makefile是一种用于自动化编译的工具,它可以根据源代码文件的依赖关系自动编译出目标文件。
Makefile的编写需要遵循一定的规则和语法,下面将介绍Makefile的编译流程。
1. 编写Makefile文件Makefile文件是一个文本文件,其中包含了编译的规则和依赖关系。
在编写Makefile文件时,需要遵循一定的语法规则,如使用TAB键缩进、使用变量和函数等。
2. 执行make命令在Makefile文件所在的目录下执行make命令,make会自动读取Makefile文件,并根据其中的规则和依赖关系进行编译。
如果Makefile文件中没有指定目标,则默认编译第一个目标。
3. 分析依赖关系在执行make命令时,make会先分析Makefile文件中的依赖关系,确定哪些文件需要重新编译。
如果某个源文件被修改了,那么与之相关的目标文件也需要重新编译。
4. 编译源文件在确定需要重新编译的文件后,make会依次编译每个源文件,生成对应的目标文件。
编译过程中,make会根据Makefile文件中的规则和命令进行编译。
5. 链接目标文件在所有的源文件都编译完成后,make会将所有的目标文件链接起来,生成最终的可执行文件。
链接过程中,make会根据Makefile文件中的规则和命令进行链接。
6. 完成编译当所有的源文件都编译完成并链接成功后,make会输出编译成功的信息,并生成最终的可执行文件。
如果编译过程中出现错误,make会输出错误信息并停止编译。
总之,Makefile编译流程是一个自动化的过程,它可以大大提高编译的效率和准确性。
在编写Makefile文件时,需要注意语法规则和依赖关系,以确保编译过程的正确性。
linux下c程序的编写实验报告实验主题:在Linux下编写C程序的实验报告一、引言(150-200字)Linux是一种广泛应用的操作系统,具有高度开放性和灵活性,也是许多程序员首选的开发环境。
在Linux中,通过编写C程序可以实现各种应用和功能。
本实验旨在通过一步一步的说明和回答,介绍在Linux下编写C 程序的基本步骤和方法。
二、实验步骤(400-500字)1. 设置编程环境在Linux中编写C程序,首先需要安装相关的开发工具和编译器。
常用的编译器有gcc和clang,可以通过包管理器进行安装。
同时,也需要一个文本编辑器来编写C代码,比如vim或者emacs。
2. 编写Hello World程序Hello World程序是C语言学习的经典入门程序,它可以在屏幕上输出"Hello World"。
在文本编辑器中新建一个文件,命名为hello.c,然后在文件中输入以下代码:#include <stdio.h>int main() {printf("Hello World\n");return 0;}保存文件后,使用gcc编译器将该文件编译成可执行文件。
在终端中执行以下命令:gcc -o hello hello.c此时会生成一个名为hello的可执行文件。
通过执行该文件,可以在终端中看到输出结果"Hello World"。
3. 命令行参数和用户输入C程序可以接受命令行参数和用户输入,从而实现更复杂的功能。
在上一步编写的程序的基础上,我们尝试接收用户输入的姓名,并输出相应的问候语。
在hello.c文件中添加以下代码段:#include <stdio.h>int main(int argc, char *argv[]) {char name[100];printf("Please enter your name: ");scanf("s", name);printf("Hello, s!\n", name);return 0;}重新编译程序并执行,可以看到在终端中会提示用户输入姓名,并输出相应的问候语。
在 Linux 系统中使用 GCC 编译器编译 C 或 C++ 程序的典型步骤如下:1. 打开终端(Terminal)。
2. 确保已正确安装 GCC 编译器。
在终端中输入以下命令:gcc --version如果 GCC 已正确安装,将显示其版本信息。
1. 使用文本编辑器(例如 `vim`, `nano`,或 `gedit` 等)创建或编辑源代码文件。
例如,为一个简单的C 程序创建一个名为`hello_world.c` 的文件。
在文件中,编写以下代码: #include <stdio.h>int main() {printf("Hello, World!\n");return 0;}1. 保存并关闭源代码文件。
2. 在终端中导航至源代码文件所在目录。
例如,如果源代码文件所在路径为`/home/username/code/`,则在终端输入:cd /home/username/code/1. 编译源代码文件。
在本例中,为了编译 `hello_world.c`, 在终端中输入以下命令:gcc -o hello_world hello_world.c这将生成一个名为 `hello_world` 的可执行文件。
如果源代码中有错误,编译过程将失败并显示错误信息。
1. 运行已编译的程序。
在终端中输入以下命令:./hello_world这将在终端中输出 "Hello, World!"。
以上步骤是一个简化的编译过程。
有时,您可能需要使用一些编译选项。
例如,应该考虑在编译过程中添加优化选项(如 `-O2`)以提高程序性能。
另外,如果您正在使用C++,则使用 `g++` 而非 `gcc`。
编译 C++ 程序的过程与上述步骤类似,只需将 `gcc` 替换为 `g++`。
makefile gcc编译
Makefile 是一个用来组织代码编译的工具,而 GCC 是一个常用的 C 和 C++ 编译器。
在 Makefile 中使用 GCC 进行编译可以通过以下步骤完成:
1. 创建一个名为 "Makefile" 的文本文件,并确保它位于你的项目根目录下。
2. 在 Makefile 中定义你的编译规则。
例如,假设你有一个名为 "main.c" 的源文件需要编译成可执行文件 "app",你可以这样编写 Makefile:
make.
app: main.c.
gcc -o app main.c.
在这个例子中,我们定义了一个名为 "app" 的目标,它依赖于"main.c" 这个源文件。
当你运行 "make" 命令时,Make 工具会根
据这个规则来执行编译。
3. 打开终端,进入到包含 Makefile 的项目目录下。
4. 运行命令 "make"。
Make 工具会读取 Makefile 文件,并执行其中定义的编译规则。
在这个例子中,它会使用 GCC 编译器来编译 "main.c" 并生成可执行文件 "app"。
需要注意的是,Makefile 可以包含更复杂的规则和变量定义,以及支持多个源文件的编译。
你可以根据你的项目需求来进一步扩展和定制 Makefile 文件。
总之,通过合理编写 Makefile 并结合使用 GCC 编译器,你可以高效地组织和管理你的代码编译过程。
实验二:gcc 、gdb 、Makefile 的使用实验目的:(一) 学会使用gcc 编译器 (二) 学会gdb 调试器的使用 (三) 学会编写 Makefile实验要求:(一)编写一应用程序,使用 gcc 进行编译,并分别使用-o ,-g ,-static ,-02等选项 (二) 编写一应用程序,使用 gdb 调试,调试中使用到该小节所介绍的所有命令(三)实现一应用程序,该程序有两个 c 文件构成,使用makefile 来完成对该程序的编译实验器材:软件:安装了 Linux 的vmware 虚拟机 硬件:PC 机一台实验步骤:(一) gcc 编译器1先用vi 编辑hello.c 文件,内容如下:#include <stdio,h> int main(void) {priritf("hello world\n"); return 0;}2、gcc 指令的一般格式为:gcc [选项]要编译的文件[选项][目标文件]例:使用gcc 编译命令,编译 hello.c生成可执行文件 hello ,并运行hellogcc]# vi hello ・ cgcc]# gcc hello.c -o hello gcc]# ./hello上面的命令一步由.c 文件生成了可执行文件,将 gcc 的四个编译流程:预处理、编译、 汇编、连接一步完成,下面将介绍四个流程分别做了什么工作 3、 -E 选项的作用:只进行预处理,不做其他处理。
例:只对hello.c 文件进行预处理,生成文件 hello.i ,并查看[root@locdlhost gcc ]# gcc -E hello •匚-o hello * i [root (alocalhost gcc ]# Is hello hel lo.c: hel lo.i通过查看可以看到头文件包含部分代码 #include <stdio.h>经过预处理阶段之后,编译 器已将stdio.h 的内容贴了进来。
4、 -S 选项的使用-S 选项的作用:只是编译不汇编,生成汇编代码[root@localhost [root@localhost [root@localho5t hello world [rootglocalhostgcc]#例:将hello.i文件只进行编译而不进行汇编,生成汇编代码 hello.s[root^localhost[rootglocalhost nello hello* c[root^localhostgcc]# gcc -S hello.i -o hello.s gcc]# Is hello.i hello,s gcc]# |5、-c 选项的使用 -c 选项的作用:只是编译不连接,生成目标文件 .0 例:将汇编代码hello.s 只编译不链接成 hello.o 文件 [root (alocalhost gcc]# gcc - c hello . s -o hello [root (alocalhost gcc]# Ishello hello.c hello.i hello.o hello.s6、将编译好的hello.o 链接库,生成可执行文件 hello[root (alocalhost [root (alocalhost hello hello.c [root (alocalhost hello worldgcc]# gcc hello ・o -o hello gcc]# Is hello.i hello.o hello.s gcc]# ・/hello7、-static 选项的使用 -static 选项的作用:链接静态库 例:比较hello.c 连接动态库生成的可执行文件 hellol 的大小 hello 和链接静态库生成的可执行文件-rwxr- xr x 1 root root 4641 J un103:47 hello -rwxr- xr-x 1 root root 605990 Jun 1 03:47 hellol -rw - r ■ ■「 ________________ 1 root root 75 J un 1 03:15 hello,c -rw -厂.1 rootroot 18880 J un 1 B3:27 hello.i -rw - r- ■ ■「八1 「oot root 844 J un 1 03:41 hello^o -rw - r- --IP -- 1 rootroot 416 J un 1 03:35 hello.s[root@localhost gcc]# gcc hello.c -o hello[root@localhost gcc]# gcc -static hello .匚-o hellol [root@localhost gcc]# ll total 636可以看到静态链接库的可执行文件 hellol 比动态链接库的可执行文件hello 要大的多,他们的执行效果是一样的8、-g 选项的使用 -g 选项的作用:在可执行程序中包含标准调试信息 例:将hello.c 编译成包含标准调试信息的可执行文件 hello22、将test.c 文件编译成包含标准调试信息的文件 testgcc]# gcc -g hello.c -o hello2 gcc]# Ishello.i hell O .Ehello »o带有标准调试信息的可执行文件可以使用9、-02选项的使用gdb 调试器进行调试,以便找出逻辑错误-02选项的作用:完成程序的优化工作例:将hello.c 用02优化选项编译成可执行文件 hello3,和正常编译产生的可执行文件hello 进行比较gcc]# gcc -02 hEllo.c -o hello3 gcc]# Is hello .c hello .o hello .i hello .s gcc]# ./lhello qcc]# ./Ihello3 (二) gdb 调试器1先用vi 编辑文件test.c 用于gdb 调试器调试,内容如下[root^localhost[root@localhost hello hello2 hellol hello.c [root (alocalhos t [root@localhost hello hello2 hellol hello3 [root (alocalhost hello world[root (alocalhost hello world[root(alocalhost gdb]# gcc -g test.c -o test [rootfatocalhost gdb]# Is test test ・c3、启动gdb进行调试l[raot^localhost gdb]# gdb testGNU gdb Red Hat Linux (6.5-25.el5rh)Copyright {C) 2006 Free Software Faundation, Inc.GDB is free software,匚overed by the GNU General Public Li匚ense r and you arewelcome to change it and/or distribute copies of it und er certain conditions* Type ^show copying" to see the conditions・There is absolut已ly no warranty for GDB* Type h,show wa rranty" for details.This GDB was configured as ''iaSG-redhat-linux-gnu1'.・・Us ing host libthreaddb library "/Iib/i686/no5egneg/libth read db.so・1"・[gdb)可以看到gdb启动界面中显示了gdb的版本、自由软件等信息,然后进入了有”gdb”开头的命令行界面4、I (list )命令I命令用于查看文件(gdb) list1#includE <;stdio ・hA2int main(void)3{4int sum(ir»t sum);5int i,result=0;6sum(160);7for(i-l;i<=100;i++){8result+=i;g}16printf("The sum in main function is %d\n"』result);(gdb)111厂etu厂n G;12}13int sum(int num)可以看到每行代码面前都有对应的行号,这样方便我们设置断点。
5、b (breakpoint )命令b用于设置断点,断点调试时调试程序的一个非常重要的手段,设置方法:在”b”命令之后加上对应的行号,如下图(gdb) b 6Breakpoint 2 at 0x804839c: file test.c, line 6.在gdb中可以设置多个断点。
代码运行时会到断点对应的行之前暂停,上图中,代码就会运行到第7行之前暂停(并没有运行第7行)。
6、info命令info命令用于查看断点情况,设置好断点后可以用它来查看7 、r ( run ) 命令(gdb) b 7Breakpoint 1 at 0x8O483a8: file test.c, line 7.(gdb) info bNum Type Disp Enb Address What1 breakpoint keep y 0xG8O483a8 in mainat test.c:7 (gdb) | r命令用于运行代码,默认是从首行开始运行,也可以在r后面加上行号,从程序中指定行开始运行。
(gdb)「Starting program: /home/Linux C/test/gdb/testThe sum in sum function is 5050Breakpoint 1, main () at test•c:77 for(i=l;i<=100;i++){(gdb) |可以看到程序运行到断点处就停止了8、p ( print )命令p命令用于查看变量的值,在调试的时候我们经常要查看某个变量当前的值与我们逻辑设定的值是否相同,输入p+变量名即可(gdb) p result$1 = 0(gdb) p numNo symbol ''num'1 in current con text((gdb) p i$2 = 2420724(gdb) |可以看到result在第6行已被赋值为零,而i目前还没有被赋值所以是一个随机数,在主函数里看不到num的值,只有进入子函数才能看到9、s ( step )命令s命令用于单步运行,另外n (next)命令也用于单步运行,他们的区别在于:如果有函数调用的时候,s会进入该函数而n不会进入该函数。