gcc
- gcc -c -S -E -Wall -L -I -l
生产静态库 将.o文件 归档生存.a文件
ar rcs libhello.a hello.o
ar:是gun归档工具 rcs:replace and create- 使用静态库方法:
1.直接将相应的.a文件放到编译过程中
gcc -Wall main.o libhello.a -o main
2.使用-l选项(可能需要指定-L选项)
gcc -Wall main.o -o main -lhello - C_INCLUDE_PATH CPP_INCLUDE_PATH LIBRARY_PATH
- 生成共享库
gcc -shared -fPIC hello.o -o libhello.so
-shared:表示生成共享库
-fPIC:表示产生位置无关码(position independent code) - 三种方式可以使共享库全局有效
1.拷贝到系统共享库目录中/usr/lib /usr/local/lib
2.更改LD_LIBRARY_PATH
3.ldconfig 配置ld.so.config,ldconfig 更新ld.so.cache - ldd 查看所使用的库
Makefile
- 通过添加.PHONY显示指定伪目标
.PHONY clean - $@ 表示规则的目标名
- $< 规则的第一个依赖文件名
- $^ 规则的所有依赖文件列表
- 不想让Makefile 信息打印出来使用@
@echo “hello” #这条语句久不会打印出来 - 隐含规则:将同名的.c文件生成同名的可执行文件
- 模式规则:%.o:%.c 或者 后缀规则:.c.o: –>将.c文件生成相应的.o文件
常用的内嵌函数
- 函数调用
$(function arguments)
$(wildcard PATTERN)
当前目录下匹配模式的文件
eg: SRC=$(wildcard *.c)$(patsubst PATTERN,REPLACEMENT,TEXT)
模式替换函数
eg: $(patsubst %.c,%.o,$src) 等价于$(src:.c=.o)- shell 函数 执行shell命令eg:$(shell ls -d */) 列出按当前文件夹下的所有文件夹
TARGET=$@
-C 跳转到指定目录下之行相应的Makefile
gdb
- until
- finish
- info b
- set args r a b c 传入a b c
查看源代码
- list 查看最近10行 list 1 ; list 1,10 ; list ,15 ;
- list fun 查看fun函数源代码
- list file:fun 查看file文件的fun函数代码
断点与观察点
- break 行号
- break fun
- break file:行号
- break file:fun
- break if 条件成立时程序停住
- info break
- watch expr 表达式 expr值发生改变,程序停住
- delete n 删除断点
单步调试
- continue
- step ->step in
- next ->step out
- finish 运行完当前函数完成返回
- until 运行程序直到退出循环体
查看运行时数据
- ptype 查看类型
- print array
- print *array@len 查看动态内存
- print x=5 改变运行时数据
调试段错误
- 访问非法地址导致段错误
1.访问系统数据区,尤其是系统保护的内存地址写数据,最常见的是0地址
2.内存越界(数组越界,变量类型不一致等)访问到不属于你的内存区域 - 程序报段错误会自动停下来,然后用bt查看栈回
core文件调试
- 在程序崩溃时,一般会产生一个core文件。core文件记录的是程序崩溃时的内存映像,并加入调试信息。core文件生成的过程叫core dump
- 设置生成core文件
ulimit -c 查看core-dump状态
ulimit -c 数字
ulimit -c unlimited - gdb 利用core文件调试
gdb 可执行文件名 此可执行文件产生的core文件
bt