【1】gcc编译器
1.预处理 :处理的是’#'开头的头文件,宏定义
单纯替换到文件中,不进行语法错误的检测。
gcc -E xxx.c -o xxx.i
2.编译:将.i文件生成汇编文件,会检测无法错误。
gcc -S xxx.i -o xxx.s
3.汇编:将汇编文件生成不可执行的二进制文件
gcc -c xxx.s -o xxx.o
4.链接:将所有的二进制文件和库链接生成可执行二进制文件
gcc xxx.o -o xxx
库:函数功能打包生成的二进制文件
gcc -c xxx.c -o xxx.o
main-->一项工程只有一个入口函数
开发--》多人开发,功能(函数接口)
.c -->都是函数功能接口,算法
(二进制)卖给其他公司--》调用函数接口实现算法,
声明(.h:函数原型(功能、参数、返回值),结构体
类型声明,全局变量、宏定义、共用体、枚举、包含
其他头文件。)
【2】分文件
main.c -->main
xxxx.c -->多个.c(不同功能函数接口)
单独的文件中,只要调用(使用),就需要声明。
.h --> .c -.h
.h :头文件
包含内容:1.包含其他头文件
2.函数声明
3.构造数据类型
4.宏定义
5.重定义名
6.全局变量
引用头文件:
系统定义头文件:#include <stdio.h>
自定义头文件:#include “add.h”
防止头文件重复包含:
#ifndef <macro>
#define <macro>
....
#endif
【3】gdb调试工具
编译不保存,执行报错的调试方法:
工具调试 、 使用打印语句调试
gcc -g test.c --》通过-g 生成可执行程序
gdb a.out
l:查看文件
b 行号/函数名:设置断点
info b:查看断点情况
d num(断点编号):删除断点
r:运行代码
p 变量名:查看变量的值
s/n:单步运行
help:帮助
q:退出
【4】make工具
1.工程管理器,顾名思义,是指管理较多的文件
Make工程管理器也就是个“自动编译管理器”,这里的“自动”
是指它能构根据文件时间戳自动发现更新过的文件而减少
编译的工作量,同时,它通过读入Makefile文件文件的内容
来执行大量的编译工作。
2.make工具的作用
当项目中包含多个c文件,但只对其中1个文件进行了修改,
那用gcc编译会将所有的文件从头编译一遍,这样效率会非常低;
所以通过make工具,可以查找到修改过的文件(根据文件时间戳),
只对修改过的文件进行编译,这样大大减少了编译时间,提高编译效率
3.Makefile是Make读入的唯一配置文件
4.Makefile的编写格式
格式:
目标:依赖
命令
目标实现,需要通过依赖文件实现
可以只有目标没有依赖。
1>有目标没有依赖
make执行Makefile文件内的指令,执行"make"默认执行的是第一个目标
对应的命令。若想执行剩余的目标,需要 "make 目标"执行。
.PHONY:clean -->.PHONY
声明一个伪命令。若之前的目标中有生成可知执行文件名为clean。
执行“make clean”时,make会认为clean目标已实现。不执行clean
目标对应的指令,用.PHONY声明后,make认为clean是一个指令,
“make clean”时会执行clean指令对应的命令。
2>有目标有依赖
目标:依赖
命令
一般是多个文件实现一项工程。对多个.c文件的管理。
5.变量
1)自定义变量:
VAR=值 $(变量)–》得到变量的值
= 递归方式展开
:= 直接赋值
+= 追加新的值 递归方式展开
?= 判断之前是否定义,如果定义了,不重新赋值,
否则赋值
2)预定义变量
CC 默认值为cc,与gcc同
RM 默认值为rm -f
CFLAGS 无默认值,一般为c编译器的选项
OBJS 一般为目标文件xx.o
3) 自动变量:
$< 第一个依赖文件的名称
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
% 匹配所有
【5】条件编译
编译器根据条件的真假决定是否编译相关的代码
一、根据宏是否定义,其语法如下:
#ifdef
……
#else
……
#endif
二、根据宏的值是否为真,其语法如下:
#if
…
#else
…
#endif
三、根据宏是否定义,作用:防止头文件重复包含
#ifndef
#define
…
#endif