Linux C编程编译与调试

来源:互联网 发布:js从json中取值 编辑:程序博客网 时间:2024/06/06 05:01

Linux C编程编译与调试

gcc编译器

gcc编译流程

编译流程
【Tips】
* Linux的可执行文件没有Windows那么明显的.exe扩展名,只需向其分配x权限即可。
sudo chmod u+x filename
* gcc可以在编译的任何阶段结束,以便检查或使用该阶段的输出。

gcc支持编译的扩展名

扩展名 源文件 .c C语言源代码文件 .C .cc .cpp C++源代码文件 .h 头文件 .a 存档文件 .i 经过预处理的C源代码文件 .ii 经过预处理的C++源代码文件 .s 汇编语言源代码文件 .S 经过预编译的汇编语言源代码文件 .o 编译后的目标文件

gcc参数

参数 作用 -o 指定生成的输出文件 -s 将C代码转换为汇编代码 -c 仅执行编译操作,不进行链接操作

应用

无参数编译

gcc a.c
a.c预处理、汇编、编译、链接成可执行文件。未指定输出则默认a.out

指定输出的文件

gcc a.c -o do
指定a.c输出为do可执行文件
gcc a.c -o /tmp/do
指定输出为/tmp目录下的do文件

多源文件的编译
  • 多个文件一起编译
    gcc a.c b.c -o do
    a.cb.c分别编译后链接成do文件
  • 分别编译各个源文件,对编译后输出的目标文件链接
gcc -c a.c  #将a.c编译成a.ogcc -c b.c  #将b.c编译成b.ogcc -o a.o b.o -o do  #将a.o 和 b.o 链接成do

以上两个方法,第一个方法编译时需要重新编译所有文件,第二个只重新编译修改的文件,未修改的文件不用重新编译。

查看编译过程

gcc -v a.c
查看编译过程和显示调用的库。

C程序的编译

编写C程序

使用VIM编写简单的C程序。
1. 打开终端
2. 在用户家目录下新建一个c文件夹
mkdir ~/c
3. 打开VIM。vim
4. 编写C程序

#include<stdio.h>int main(){    printf("hello");    return 0;}
  1. 编写完成后,按Esc返回到普通模式,保存文件到家目录下的c文件夹,保存为a.c
    :wq ~/c/a.c

使用gcc编译

  1. 打开终端,进入上文创建的~/c文件夹。
    cd ~/c
  2. 使用gcc编译
    gcc a.c -o a
  3. 执行编译出的可执行文件
    ./a

编译过程详解

这里写图片描述
* 预处理:对预编译语句(如宏定义define)和文件包含进行处理。需要完成的工作室对预编译指令进行替换,把包含文件放置到需要编译的文件中。最终生成一个非常完整的C源文件。
* 编译:对预处理后的文件编译,生成.s的汇编语言文件。
* 汇编:处理汇编语言。调用汇编处理程序将汇编语言汇编成二进制代码。最终生成.o目标文件。
* 链接:将多个汇编生成的目标文件以及引用的库文件进行模块链接生成一个完整的可执行文件。

gdb调试器

gdb简介

主要使用gdb进行下面5个方面的操作:
* 启动程序:在启动程序时,可以设置程序运行环境。
* 设置断点:这里的断点可以使行数、程序名称或条件表达式。
* 查看信息:断点停止后,可以查看程序的运行信息和显示程序变量的值。
* 分步运行:使程序一个个语句的执行。
* 改变环境:可以在程序运行时改变程序的运行环境和程序变量。

在程序中加入调试信息

为了使用gdb进行调试,需要在编译程序中加入供gdb使用的调试信息。使用-g参数
gcc -g -o a.debug a.c
编译a.c生成一个a.debug的可执行程序,其中加入了供调试所用的信息。

gdb的使用

启动gdb

在终端输入
gdb

加载需要调试的程序

file a.debug
运行结果如下,证明已加载此文件。
Reading symbols from /home/tian/a.debug ...done

在gdb中查看代码

gcc -g编译后的a.debug程序加入了断点。可以用list查看程序的源代码和断点。
1.list 1,会显示第一个断点前的代码。以上文a.c为例,会显示以下:
这里写图片描述
2.按Enter键会显示下一个断点前的代码。

加入断点

break命令可以增加断点。如在上文的例程第3行增加一个断点。
break 3

查看断点

info break

运行程序

  • run运行程序
  • next在下一行停下
  • continue在下一个断点位置停下
  • step单步运行。

stepnext类似,都可以实现单步运行。不同的是,在遇上函数调用时,step可以进入函数内部,next跳过函数的调用

变量的查看

print

退出调试

q

gdb常用命令

  1. backtrace:显示程序中的当前位置和表示如何到达当前位置的栈跟踪
  2. cd:改变当前工作目录
  3. clear:删除刚才停止处的断点
  4. delete:删除一个断点
  5. display:程序停止时显示变量和表达式
  6. info files:显示被调试文件的信息
  7. info func:显示所有的函数名称
  8. info local:显示所有的局部信息变量
  9. info var:显示所有的全局和静态变量名称
  10. whatis:显示变量或函数类型