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.c
和b.c
分别编译后链接成do
文件 - 分别编译各个源文件,对编译后输出的目标文件链接
gcc -c a.c #将a.c编译成a.o
gcc -c b.c #将b.c编译成b.o
gcc -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;
}
- 编写完成后,按
Esc
返回到普通模式,保存文件到家目录下的c文件夹,保存为a.c
:wq ~/c/a.c
使用gcc编译
- 打开终端,进入上文创建的
~/c
文件夹。
cd ~/c
- 使用gcc编译
gcc a.c -o a
- 执行编译出的可执行文件
./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
单步运行。
step
与next
类似,都可以实现单步运行。不同的是,在遇上函数调用时,step
可以进入函数内部,next
跳过函数的调用
变量的查看
print
退出调试
q
gdb常用命令
backtrace
:显示程序中的当前位置和表示如何到达当前位置的栈跟踪cd
:改变当前工作目录clear
:删除刚才停止处的断点delete
:删除一个断点display
:程序停止时显示变量和表达式info files
:显示被调试文件的信息info func
:显示所有的函数名称info local
:显示所有的局部信息变量info var
:显示所有的全局和静态变量名称whatis
:显示变量或函数类型