Linux下C程序的编辑,编译和运行以及调试(c++使用g++)

您所在的位置:网站首页 c程序的运行环境和运行c程序的方法的实验心得 Linux下C程序的编辑,编译和运行以及调试(c++使用g++)

Linux下C程序的编辑,编译和运行以及调试(c++使用g++)

2024-07-16 14:00| 来源: 网络整理| 查看: 265

https://my.oschina.net/tashi/blog/191468

Linux下C程序的编辑,编译和运行以及调试

要使用的工具:编辑:vim(vi)编译和运行:gcc调试:gdb

安装很简单(以下是以在CentOS中安装为例):

yum vim gcc gdb

1.使用vim编辑源文件首先,打开终端练下手:

vim hello.c

(进入一般模式)按下"i",进入编辑模式,在编辑模式下输入:

#include  int main(){     printf("Hello, World!\n");     return 0; }

输入完成,按"ESC"键,回到一般模式,然后按下":wq",即可保存并退出vim。

附注:在一般模式下,按下":%!xxd"查看hello.c的16进制形式,回到文本格式按下":%!xxd -r"。查看hello.c的二进制形式,按下":%!xxd -b",这是hello.c保存在磁盘上的存储状态。至此,在vim已完成C源文件的编辑。关于vim的使用,直接上网搜索vim,相关的文章是相当多的;或者参考vim的联机帮助,在命令行上键入"man vim"即可。

2.编译和运行

gcc命令的基本用法:

gcc[options] [filenames]

其中,filenames为文件名;options为编译选项当不使用任何编译选项编译hello.c时,gcc将会自动编译产生一个a.out的可执行文件:

[root@localhost c]# ls hello.c [root@localhost c]# gcc hello.c [root@localhost c]# ls a.out  hello.c

执行:

[root@localhost c]# ./a.out Hello, World!

使用-o编译选择,可以为编译后的文件指定一个名字:

[root@localhost c]# ls a.out  hello.c [root@localhost c]# gcc hello.c -o hello [root@localhost c]# ls a.out  hello  hello.c

执行:

[root@localhost c]# ./hello Hello, World!

注意:使用-o选项时,-o后面必须跟一个文件名,即:-o outfile。

为了便于描述后面的选项,删除hello和a.out可执行文件。

结合介绍gcc的编译选项,分析hello.c的编译和执行过程:(1)预处理阶段:使用-E选项,对输入文件只做预处理不编译。当使用这个选项时,预处理器的输出被送到标准输出而不是存储到文件。如果想将预处理的输出存储到文件,可结合-o选项使用,使用如下:

[root@localhost c]# ls hello.c [root@localhost c]# gcc -E hello.c -o hello.i [root@localhost c]# ls hello.c  hello.i

使用less查看下hello.i:

[root@localhost c]# less hello.i

(2)编译阶段:使用-S选项,将C程序编译为汇编语言文件后停止编译,gcc编译产生汇编文件的默认后缀为.s。

[root@localhost c]# ls hello.c  hello.i [root@localhost c]# gcc -S hello.c [root@localhost c]# ls hello.c  hello.i  hello.s

在gcc -S hello.c处,使用C源文件编译,也可以用gcc -S hello.i的预处理文件编译,结果一样。

使用-S编译时,也可以和-o结合使用指定编译产生的汇编语言文件的名字:

[root@localhost c]# ls hello.c  hello.i  hello.s [root@localhost c]# gcc -S hello.i -o hello_s.s [root@localhost c]# ls hello.c  hello.i  hello.s  hello_s.s

可使用less命令查看汇编代码。

(3)汇编阶段:使用-c选项,将C源文件或者汇编语言文件编译成可重定向的目标文件(二进制形式),其默认后缀为.o。

[root@localhost c]# ls hello.c  hello.i  hello.s  hello_s.s [root@localhost c]# gcc -c hello.s [root@localhost c]# ls hello.c  hello.i  hello.o  hello.s  hello_s.s

也可以和-o结合使用指定编译产生的目标文件的名字:

[root@localhost c]# gcc -c hello.s -o hello.o

由于hello.o是二进制文件,使用less查看显示为乱码;

然后使用vim hello.o打开也显示为乱码,按下":%!xxd"查看其16进制形式,按下":%!xxd -r"退出 16进制查看模式,回到乱码状态。在退出vim时,若提示已经修改了文件,则使用":q!"强制退出。

(4)链接阶段:链接器将可重定向的目标文件hello.o以及库文件(如printf.o)执行并入操作,形成最终可执行的可执行目标文件。

[root@localhost c]# ls hello.c  hello.i  hello.o  hello.s  hello_s.s [root@localhost c]# gcc hello.o [root@localhost c]# ls a.out  hello.c  hello.i  hello.o  hello.s  hello_s.s

可使用-o选项,指定输出文件(即可执行目标文件)的名字:

[root@localhost c]# gcc hello.o -o hello [root@localhost c]# ls a.out  hello  hello.c  hello.i  hello.o  hello.s  hello_s.s

(5)执行阶段:

[root@localhost c]# ./a.out Hello, World! [root@localhost c]# ./hello Hello, World!

由此,看出前面使用的gcc hello.c -o hello命令,将hello.c直接编译为可执行的目标文件,中间经过于处理器的预处理阶段(源文件到预处理文件),编译器的编译阶段(预处理文件到汇编文件),汇编器的汇编阶段(汇编文件到可重定向的目标文件),链接器的链接阶段(可重定向的目标文件到可执行的目标文件)。

还有其他的选项如下:-Idir:dir是头文件所在的目录

-Ldir:dir是库文件所在的目录

I,L参数的使用可以参考https://blog.csdn.net/xianyoudianxueyuan/article/details/46898085

-Wall:打印所有的警告信息-Wl,options:options是传递给链接器的选项

编译优化选项:-O和-O2-O选项告诉GCC 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。-O2选项告诉GCC产生尽可能小和尽可能快的代码。-O2选项将使编译的速度比使用-O时慢。但通常产生的代码执行速度会更快。

除了-O和-O2优化选项外,还有一些低级选项用于产生更快的代码。这些选项非常的特殊,而且最好只有当你完全理解这些选项将会对编译后的代码产生什么样的效果时再去使用。这些选项的详细描述,请参考GCC的联机帮助,在命令行上键入"man gcc"即可。

调试选项:-g(使用详情见第3部分)-g选项告诉GCC产生能被GNU调试器使用的调试信息以便调试你的程序。即:在生成的目标文件中添加调试信息,所谓调试信息就是源代码和指令之间的对应关系,在gdb调试和objdump反汇编时要用到这些信息。

3.调试虽然GCC提供了调试选项,但是本身不能用于调试。Linux 提供了一个名为gdb的GNU调试程序。gdb是一个用来调试C和C++程序的调试器。它使你能在程序运行时观察程序的内部结构和内存的使用情况。以下是gdb所提供的一些功能: a.它使你能监视你程序中变量的值;b.它使你能设置断点以使程序在指定的代码行上停止执行;c.它使你能一行行的执行你的代码。

(1)启动gdb在命令行上键入"gdb"并按回车键就可以运行gdb了,如下:

[root@localhost c]# gdb GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1) Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.  Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see:. (gdb)

当启动gdb之后,即可在命令行上输入命令进行相关的调试操作。也可以以下面的方式来启动gdb:

[root@localhost c]# gdb hello

这种方式启动gdb,直接将指定调试的程序文件装载到调试环境中。也就是让gdb装入名称为filename的可执行文件,从而准备调试。为了能够进行调试,当前调试的程序文件中必须包含调试信息。其中调试信息包含程序中的每个变量的类型和其在可执行文件里的地址映射以及源代码的行号,gdb利用这些信息使源代码和机器码相关联。因此在使用gcc编译源程序的时候必须使用-g选项,以便将调试信息包含在可执行文件中。例如:

[root@localhost c]# gcc -g hello.c -o hello

gdb还提供了其他的启动选项,请参考gdb的联机帮助。在命令行上键入"man gdb"并回车即可。

(2)gdb基本命令单步执行和跟踪函数调用程序编辑如下:

#include  int add_range(int low, int high){     int i;     int sum;     for(i = low; i 


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3