本文内容:
- gcc编译器的使用
- 静态库与动态库
- Make工程管理文件
- gdb调试工具
gcc编译器
编译流程:
源程序(*.c) => 预处理 => 编译 => 汇编 => 链接 => 可执行文件
编译选项:
编译选项 | 功能 |
---|
-o | 指定输出文件,默认:a.out | -E | 仅进行预处理,生成预处理代码(直接输出,可通过-o输出到文件) | -S | 编译到汇编语言,生成汇编代码:*.s | -c | 编译汇编到目标代码,不进行链接,生成目标文件:*.o | -g | 编译时在可执行文件中插入调试信息,以便gdb进行调试 | -Wall | 显示更多警告信息 | -O n | 优化编译,提高可执行程序的运行速度,n可取值:1,2,3 | lx | 链接x链接库,对于库文件为libx.so或libx.a(e.g. lm 链接数学库) | Idir | 指定头文件的位置 | Ldir | 指定库文件的位置 |
注意参数顺序:-l(小写L),-I(大写i),-L需在-o和文件名之后
函数库
函数库是一组预先编译好的函数集合,以便重复使用。
静态库:*.a
共享库(动态库):*.so
静态库
在链接阶段,编译器将指定的静态库和程序代码结合生成可执行文件。
创建静态库
将源码编译为目标文件(*.o),然后使用ar创建静态库
ar cr[v]/f 静态库 目标文件列表
c 创建归档
r 将目标文件追加或者替换原有文件
v 显示过程信息
f 显示库文档列表
ar cr libsort.a sort.o parray.o
ar -t libsort.a
gcc -o test main.c -lsort -L
共享库
在编译时,并不将函数库的代码插入到可执行程序中,而是将库的引用插入,在执行期动态的加载函数库。
Make工程管理
make命令
在模块化开发中,make来根据程序模块的修改情况重新编译链接目标代码,以保证目标代码总是由它的最新模块组成。
Makefile文件
使用make命令时,必须编写Makefile文件。Makefile描述了软件包中各个文件之间的依赖关系,提供了更新每个文件的命令。
主要内容:显式规则,隐式规则,变量定义,文件指示,注释
make使用
make [选项] [宏] [目标]
-f makefile 指定规则文件,默认Makefile
-d 显示调试信息
-n 显示命令,但不执行
-s 执行命令但不显示任何信息
make规则
make根据make规则执行命令对目标文件进行编译更新,规则保存在规则文件中,默认名为GNUmakefile、makefile或Makefile。 一个Makefile文件主要由一系列的make规则组成,每条规则包含:
目标文件:依赖文件列表 <TAB>命令列表
Makefile文件示例:
CC = gcc
OBJS = main.c
TARGET = test
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c,%.o,$(SRC))
CFLAGS += -g -Wall --std=c89
LFLAGS += -lm
$(TARGET) : test.o
$(CC) $^ $(LFLAGS) -o $@
test.o : test.c
$(CC) -c $^ $(CFLAGS) -o $@
clean :
$(RM) -r $(OBJ) test
gdb调试工具
跟踪指定程序的运行,给出它的内部运行状态以协助开发者定位程序中的错误。
gdb [选项] [可执行程序]
-n 不执行任何初始化文件中的命令,默认初始化文件为 .gdbinit -q 安静模式运行,不输出介绍和版权信息 -cd dir 将dir作为调试的工作目录,默认为当前目录
gdb命令
命令 | 作用 |
---|
file | 装入待调试程序 | set args < 文件名 | 重定向输入文件 | list(l) | 列出源文件,默认显示10行【main函数开始】 | next(n) | 执行下一行程序但不进入函数 | step(s) | 执行下一行程序且进入函数 | kill | 终止当前调试程序 | run? | 执行当前程序 | watch | 动态监视指定变量的值,当变量变化时立即暂停执行 | print§ | 打印表达式值 | break(b) n | 在第n行设置断点 | quit(q) | 退出调试 | fin | 结束当前函数 | continue? | 运行到下一个断点 | delete n | 删除第n号断点 | info | 查看状态信息 |
注意在进行调试的时候,先添加断点,让程序执行可以在某一处停下,随后运行run命令开始调试
b 12
info breakpoint
delete 1
p a
p a[0]@10
|