文章目录
GCC简介
gcc 所支持后缀名解释
.c | c原始程序 |
---|---|
.C / .cc /.cxx | C++原始程 |
.m | Objective—C原始程序 |
.i | 已经过预处理的C原始程序 |
.ii | 已经过预处理的C++原始程序 |
.s/.S | 汇编语言原始程序 |
.h | 预处理文件(头文件) |
.o | 目标文件 |
.a/.so | 编译后的库文件 |
一、GCC编译的过程
GCC的编译流程分为四个步骤:
- 预处理
- 编译
- 汇编
- 链接
#include<stdio.h>
#include<math.h>
#define N 10
#define _DEBUG_
int main(int argc ,char **argv)
{
double m =615;
double n;
m += N;
n = sqrt(m);
#ifdef _DEBUG_
printf("debug:m=%lf n=%lf\n",m,n);
#else
printf("release:m=%lf n=%lf\n",m,n);
#endif
return 0;
}
1. 预处理:
把程序中 # 开头的语句进行处理 ,生成文件 .i
把头文件和宏都展开,判断语句,把判断结果我语句保留.
我们来查看一下:
gcc -E gccc.c -o gccc.i
2.编译:
把预处理文件 .i 进行处理,生成汇编文件 .s,这个过程会检测代码的错误。
gcc -S gccc.i -o gccc.s
3.汇编处理
把汇编文件 .s 进行汇编处理,生成目标文件 .o
4. 链接
将目标程序连接库资源,生成可执行程序
#gcc gccc.s -o gccc
#./gccc
二、GDB调试工具
1. 调试器——GDB调试流程
首先使用gcc对test.c 进行编译,注意一定要加上选项 “ -g ”
#gcc -g test.c -o test
#gdb test
注意:gdb是在你运行时候,发现结果不对,当你编译时候出现错误,gdb是无法调试的。
GDb调试流程 | 说明 |
---|---|
-(gdb)l | 查看文件 |
-(gdb)b +行数 | 设置断点 |
-(gdb)info b | 查看端点情况 |
-(gdb)r | 运行代码 |
(gdb) p n | 查看变量值 |
(gdb)n / (gdb) s | 单步运行 |
(gdb)c | 恢复程序运行(断点调换) |
(gdb)help [command] | 帮助 |
程序文件和可执行文件大小是不同的,可执行文件大很多。
2. GDB的使用切记点:
- 在gcc编译选项中一定要加入“ -g ”
- 只有在代码处于 “ 运行 ” 和 “ 暂停 ” 状态时才能查看变量值
- 设置断点后程序在指定行之前停止。
若我们在gdb如何调试参数呢?
# (gdb) set args X X
3. 条件编译
-
编译器根据条件的真假决定是否编译相关的代码
-
常见的条件编译有两种方法:
根据宏是否定义,其语法如下:
#ifdef<macro> //如果定义一个宏,执行一段代码, ..... #else //否则执行其他代码 .... #endif
根据宏的值,其语法如下:
#if<macro> ...... #else ..... #endif