Linux系统上 C 程序的编译与调试需要用到gcc,这里就不详细介绍gcc的安装,程序编译链接过程在下面的链接中。
详情请点击↓
提示:以下是本篇文章正文内容,下面案例可供参考
一、Linux 系统上 C 程序的编译
C程序的编译需要四部:预编译、编译、汇编、链接
其分布命令如下:
$ gcc -E main.c -o main.i //预编译
$ gcc -S main.i -o main.s //编译
$ gcc -c main.s -o main.o //汇编
$ gcc -o main main.o //链接
也可以一步完成:
$ gcc -o main main.c
二、make && makefile文件
make 管理工程实现自动化编译 (和 vs 比较)示例:
对 main.c add.c max.c 三个文件进行编译
文件展示:
add.h:
int add( int x, int y);
add.c:
int add( int x, int y)
{
return x + y;
}
max.h:
int max( int x, int y);
max.c:
int max( int x, int y)
{
return x > y ? x : y;
}
main.c:
#include<stdio.h>
#include"add.h"
#include"max.h"
int main()
{
int x = 2;
int y = 5;
printf("x = %d,y = %d\n",x,y);
printf("add = %d\n",add(x,y));
printf("max = %d\n",max(x,y));
return 0;
}
makefile文件:
all : main
main : main.o add.o max.o
gcc -o main main.o add.o max.o
main.o : main.c
gcc -c main.c
add.o : add.c
gcc -c add.c
max.o : max.c
gcc -c max.c
clean :
rm -rf *.o main
make的使用:
make 命令根据 makefile 文件的规则生成可执行程序
三、gdb调试
3.1 Debug 版本和 Release 版本
Debug 版本:
Debug 版本为可调式版本,生成的可执行文件中包含调试需要的信息。我们作为开发人员,最常用的就是 debug 版本的可执行文件。
Debug 版本的生成:
因为调试信息是在编译过程时加入到中间文件(.o)中的,所以必须在编译时控制其生成包含调试信息的中间文件。
gcc -c hello.c -g —> 生成包含调试信息的中间文件
gcc -o hello hello.o
或者 gcc -o hello hello.c -g
Release 版本:
Release 版本为发行版本,是提供给用户使用的版本。用 gcc 默认生成的就是 Release 版本。
首先将源代码编译、链接生成 Debug 版本的可执行文件,然后通过‘gdb Debug 版本的可执行文件名’进入调试模式。
3.2 单进程、单线程基础调试命令
l //显示 main 函数所在的文件的源代码
list 文件名:num //显示 filename 文件 num 行上下的源代码
b 行号 //给指定行添加断点
b 函数名 //给指点函数的第一有效行添加一个断点
info break //显示断点信息
delete 断点号 //删除指定断点
disable 断点号 //将断点设定为无效的,不加断点号,将所有断点设置为无效
enable 断点号 //将断点设定为有效的,不加断点号,将所有断点设置为有效
r(run) //运行程序
n(next) //单步执行
c (continue) //继续执行,直接执行到下一个断点处
s //进入将要被调用的函数中执行
finish //跳出函数
q //退出调试
p val //打印变量 val 的值
p &val //打印变量 val 的地址
p a+b //打印表达式的值
p arr(数组名) //打印数组所有元素的值
p *parr@len //用指向数组的指针打印数组所有元素的值
display //自动显示,参数和 p 命令一样
info display //显示自动显示信息
undisplay + 编号 //删除指定的自动显示
ptype val //显示变量类型
bt //显示函数调用栈