Gcc how to

最近在看Linux系统下C程序开发详解,看的是电子档,下面是我学习的一些总结和知识扩展

第一章编译与调试总结

1.编写第一个C程序

1.1打开Ubuntu系统的终端。单击“主菜单”|“系统工具”|“终端(Termial)”选项,或直接按“Ctrl+Alt+T”打开Termial。

1.2在终端中输入下面命令,在用户目录“root”下建立新的文件夹,名字为C.

$ mkdir C

1.3在终端界面中输入“vim”命令,然后按“Enter”键,系统会启动vim。

1.4在vim中按下‘i’键,这样就可以输入你的C代码了。

C 语言经典的入门例子是 Hello World,下面是一示例代码:

1 #include <stdio.h>
2 int main(void)
3 {
4     printf("Hello, world!\n");
5     return 0;
6 }

代码输入完成后,按“Esc键”,返回到普通模式。再输入以下命令,以保存文件,文件名为hello.c。

1 $ :w /root/c/hello.c

1.5再输入“:q”命令,推出vim。这样就完成了一个C程序的编写。

2.GCC编译程序

2.1打开终端,输入以下命令进入用户目录“/root/c”。

cd c

2.2输入以下命令,使用gcc编译已经编写好的c程序。

gcc -g -wall hello.c -o hello

该命令将文件‘hello.c’中的代码编译为机器码并存储在可执行文件 ‘hello’中。机器码的文件名是通过 -o 选项指定的。该选项通常作为命令行中的最后一个参数。如果被省略,输出文件默认为 ‘a.out’。

注意到如果当前目录中与可执行文件重名的文件已经存在,它将被覆盖。

选项 -Wall 开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。编译器有很多其他的警告选项,但 -Wall 是最常用的。默认情况下GCC 不会产生任何警告信息。当编写 C 或 C++ 程序时编译器警告非常有助于检测程序存在的问题。 注意如果有用到math.h库等非gcc默认调用的标准库,请使用-lm参数

本例中,编译器使用了 -Wall 选项而没产生任何警告,因为示例程序是完全合法的。

选项 ""-g"" 表示在生成的目标文件中带调试信息,调试信息可以在程序异常中止产生core后,帮助分析错误产生的源头,包括产生错误的文件名和行号等非常多有用的信息。

2.3在终端输入“ls”命令,终端会出现hello.c hello.out两个文件。

2.4输入下面的命令对这个程序添加可执行权限。

chmod +x hello.out

2.3运行该程序,输入可执行文件的路径如下:

./hello.out

这将可执行文件载入内存,并使 CPU 开始执行其包含的指令。 路径 ./ 指代当前目录,因此 ./hello 载入并执行当前目录下的可执行文件 ‘hello’。

3.在GDB中运行程序

3.1使用gdb调试程序时,首先要生成.debug文件,也就是要在程序中加入调试信息。方法是在编译程序时使用一个-g参数。

gcc -g -o hello.debug hello.c

这时,编译程序hello.c,生成一个hello.debug的可执行程序。这个可执行程序中加入了供调试所用的信息。

3.2启动gdb,直接在终端下输入“gdb”。

3.3加载hello.debug程序

file hello.debug

用gcc命令编译程序加入了-g命令以后,编译后的hello.debug程序中加入了断点。可以用list命令显示程序的源代码和断点。

list 1

这时,gdb显示第一个断点以前的代码。再按下“Enter”键,显示下一个断点以前的代码。

3.4在程序中加入断点

使用break命令增加程序的断点。

break 1
break 5
break 9

在程序的第1行、5行、9行增加断点。

我们用break命令来设置断点。下面有几点设置断点的方法:

break
在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。
break
在指定行号停住。
break +offset

break -offset
在当前行号的前面或后面的offset行停住。offiset为自然数。
break filename:linenum
在源文件filename的linenum行处停住。
break filename:function
在源文件filename的function函数的入口处停住。
break *address
在程序运行的内存地址处停住。
break
break命令没有参数时,表示在下一条指令处停住。
break ... if
...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环体中,可以设置break if i=100,表示当i为100时停住程序。

查看断点时,可使用info命令,如下所示:(注:n表示断点号)

3.5运行程序

输入“run”程序在第一个断点处停止运行。输入“next”命令,程序会在下一行停下。输入“continue”,程序会在下一个断点的位置停下。

3.6查看运行时数据

在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是:

1 print <expr>
2 print /<f> <expr>

是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。

“step”命令配合“print”命令使用,表示程序只运行一步。单步执行配合print,可以实时查看某变量或寄存器的值。

好的,第一章的知识总结就到此结束了。后面会继续推出后面章节的知识归纳和扩展。在学习第一章时参考了以下资料:

http://wiki.ubuntu.org.cn/Gcchowto

http://wiki.ubuntu.org.cn/index.php?title=%E7%94%A8GDB%E8%B0%83%E8%AF%95%E7%A8%8B%E5%BA%8F&variant=zh-cn

原文链接: https://www.cnblogs.com/Zero_Victor/archive/2013/05/04/3059072.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/87132

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午10:56
下一篇 2023年2月9日 下午10:57

相关推荐