linux的C开发工具
本文内容:gcc编译器的使用静态库与动态库Make工程管理文件gdb调试工具gcc编译器编译流程:源程序(*.c) => 预处理 => 编译 => 汇编 => 链接 => 可执行文件编译选项:编译选项功能-o指定输出文件,默认:a.out-E仅进行预处理,生成预处理代码(直接输出,可通过-o输出到文件)-S编译到汇编语言,生成汇编代码:*.s-c编译汇编到目标代码,不
本文内容:
- 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 #-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的方法
更多推荐
所有评论(0)