在Linux、MacOS上编写C、C++程序离不开gcc,gdb,make三大法宝,尽管现在有很多集成的IDE已经实现了这样的功能,但是学习这种最原始的C编译方式能更好从底层来了解c的编译模式。本人习惯用vim作为开发工具,因此使用这些工具成了必备的技能,现在对这些工具进行一个总结。
1.gcc编译工具
c语言编译过程大致可以预处理、编译、汇编、链接四个部分,gcc当然也可以通过相应的命令来实现这四个部分,具体执行如下:
1 | 预处理 gcc -E hello.c -o helle.i |
当然,为了方便我们可以直接使用,以下命令快速生成可执行文件:
1 | gcc hello.c -o hello |
使用以下命令进行执行,即可运行文件:
1 | ./hello |
一个大型项目往往有很多个文件构成,同时可能还需要调用library中的库,因此往往将文件使用-c
命令生成.o
文件,同时也可以使用-l*library,调用系统库,最后在执行链接命令,多文件gcc,将会在后续的make中详细讲解。
2.gdb程序调试工具
gdb是GNU开发的组织发布的一个功能强大的、在UNIX/Linux操作系统上使用的C/C++和汇编语言程序的调试工具。gdb主要帮助用户在调试程序时完成4方面的工作:
- 启动程序,按用户要求影响程序运行行为。
- 使运行程序在指定条件处停止。
- 当程序停止时,检查它出现了什么问题。
- 动态改变程序的执行环境,这样就可以先纠正一个错误,然后再纠正其他错误。
那么如何使用gdb呢?首先为了让程序能够被gdb调试,需要在编译过程中加入-g命令,如下:
1 | gcc -g hello.c -o hello |
于是可以使用gdb hello来启动gdb调试程序了。
1 | gdb hello |
相关操作命令如下:
指令 | 作用 |
---|---|
run | 运行程序 |
b+行数 | 在相应的行上打断点 |
p+变量名 | 输出相应变量的内容 |
n | 单步调试(不进函数) |
s | 单步调试(进函数) |
c | 继续执行代码直到下一个断点或程序结束 |
list1,25 | 列出当前断点处后续几行代码,默认为10行 |
watch+变量名 | 运行代码直到相应变量改变,监控变量 |
i b | 查看break信息 |
i watch | 查看监控的信息 |
d bnum | 删除断点 bnum为断点号码 |
3.make程序维护工具
可以通过makefire葵花宝典进行进一步的学习与了解。
make的主要功能是,执行生成新版本的目标程序所需的各个步骤,即自动检测一个大型程序的哪一部分需要重新编译,然后发出命令,重新编译它们。make执行的关键在于能够找出上一次各文件修改的时间,利用时间来比较相依文件最后一次的修改时间。若目标文件的修改时间早于依赖文件的修改时间,则必须利用依赖文件进行处理。
make命令,主要要在项目中创建一个makefile文件,文件其实是一些gcc命令的集成,具体我们分为5层来讲解如何编写makefile文件。
- 第一层:显示规则
目标文件:依赖文件
[TAB]指令
第一个目标文件是最终目标!!!!
例1:
1 | hello:hello.o |
例2:
1 | test:circle.o cube.o main.o |
第二层:变量 =(替换) +=(追加) :=(恒等于)
使用变量, $(变量名) 替换1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18TAR = test
CC := gcc
OBJ = circlr.o cube.o mian.o
$(TAR):$(OBJ)
$(CC) $(OBJ) -o $(TAR)
circle.o:circle.c
$(CC) -c circle.c -o circle.o
cube.o:cube.c
$(CC) -c cube.c -o cube.o
main.o:main.c
$(CC) -c main.c -o main.o
clean:
rm -rf *.o test第三层:隐含规则
%.c
%.o
任意的点.c或.o 文件*.c
*.o
所有的.c或.o1
2
3
4
5
6
7
8
9
10
11
12TAR = test
CC := gcc
OBJ = circlr.o cube.o mian.o
$(TAR):$(OBJ)
$(CC) $(OBJ) -o $(TAR)
%.o:%.c
$(CC) -c %.c -o %.o
clean:
rm -rf *.o $(TAR)第四层:通配符
$^
所有依赖文件$@
所有的目标文件$<
所有依赖文件的第一个文件1
2
3
4
5
6
7
8
9
10
11
12TAR = test
CC := gcc
OBJ = circlr.o cube.o mian.o
$(TAR):$(OBJ)
$(CC) $^ -o $@
%.o:%.c
$(CC) -c $^ -o $@
clean:
rm -rf *.o $(TAR)第五层:函数
参考葵花宝典和makefile教程。