本文内容:

  1. gcc编译器的使用
  2. 静态库与动态库
  3. Make工程管理文件
  4. 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	#-L在当前目录下搜索库文件libsort.a
								#得到可执行文件test

共享库

在编译时,并不将函数库的代码插入到可执行程序中,而是将库的引用插入,在执行期动态的加载函数库。

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)#搜索.c文件
OBJ = $(patsubst %.c,%.o,$(SRC))#将.c文件转化为.o文件

#添加参数
CFLAGS += -g -Wall --std=c89

#添加链接
LFLAGS += -lm

#链接函数库
$(TARGET) : test.o	#$(OBJ)
	$(CC) $^ $(LFLAGS) -o $@

#编译源文件
test.o : test.c		#将test.c编译为test.o
	$(CC) -c $^ $(CFLAGS) -o $@
#$(OBJ) : $(SRC)
#	$(CC) -c $^ $(CFLAGS) -o $@

#删除文件
clean :
	$(RM) -r $(OBJ) test

#编译、链接时必须次行为Tab
#目标文件 : 依赖文件
#wildcard为搜索,patsubst为替换
#.c为源文件,.o为汇编文件

#抑扬符($^)表示上行所有依赖文件
#艾特($@)  表示上行所有目标文件
#小于符($<)表示第一个依赖文件
#$+  所有的依赖文件,并以空格分开

#使用定义变量时,必须以$()的格式使用
#Makefile 与 makefile 均可使用make命令,但makefile优先级更高,通常使用Makefile

#链接第三方库时,可以用 INC = -I /usr/..../ 方式寻找头文件
#然后可以用(例如) LFLAGS += -lcairo 链接cairo库(绘图)
#也可以采用 LIBS = -L /usr/..../ (路径)进行链接第三方库

#使用Makefile文件时,make命令执行编译,链接,且仅对变化有效
#删除文件时使用make clean命令,RM为Makefile文件自带变量,RM = rm -f

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 #在第12行添加断点
info breakpoint #查看所有断点编号及位置
delete 1#删除1好断点
p a#查看a的值,或者查看数组a的所有元素
p a[0]@10#查看从a[0]开始的10个元素,当数组内存较大时,不适合采用p a的方法
Logo

更多推荐