gcc,gdb,makefile
2016-03-31 01:41
253 查看
gcc
1.gcc 编译时加入调试信息
gcc -g
2.c++编译
gcc -lstdc++ xxx.cpp
或:
g++ xxx.cpp
3.静态库 和 动态库
这段转自这里1,如何生成静态库
静态库只是一堆object对象的集合,使用ar命令可以将.o文件打包成.a静态库。
假设gcc已经生成了a.o, b.o, c.o,使用下面的命令即可生成libmylib.a
$ar rcs libmylib.a a.o b.o c.o
2,如何生成动态库
动态库的生成由gcc直接生成。
假设a.c, b.c两个文件,通过下面的命令可生成libmylib.so
$gcc a.c b.c -o libmylib.so --shared
3,如何使用库
gcc中关于库的参数有:
-L 指定搜寻库的目录
如指定当前目录 gcc -L .
-l 指定要链接的库的名称
加入库的名称是libmylib.a,则gcc -l mylib,即去头去尾。
–static 组织在链接时使用动态库
–shared 生成动态库
–static-libgcc 链接静态libgcc库
–shared-libgcc 链接动态libgcc库
可见对动态库和静态库的使用方法是一样的,同一个库如果同时存在动态库和静态库,优先链接动态库,除非使用–static强制使用静态库。
gcc 编译动态库时有人用-fpic,不知道有什么用
gcc -c -fpic hello1.c hello2.c
ldd查看程序需要的动态连接库
gdb
0.运行和命令行参数
start
r=
run
c=
continue
n=
next
finish返回当前函数
until直到循环结束
run arg1 arg2 arg3=
set args arg1 arg2 arg3+
run
k=
kill
show args
show paths
show environment
info program
调试已运行进程:
gdb [program] [pid]
或者:
gdb [program]
然后 ,
attach [pid]
1.查看代码
l=
list
搜索
search [regexp]
forward-search [regexp]
reverse-search [regexp]
查看汇编
disaaaemble [function name]
2.断点
break [line number]
break [function name]
i breakpoints=
info breakpoints
delete breakpoint [number]
disable breakpoint [number]
enable breakpoint [number]
3.查看变量x
p x=
print x
inspect?
display x
undisplay x
display/i $pc???
数组:
malloc的指针
print *array@len
静态数组
print array
格式:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
(gdb) p i $21 = 101 (gdb) p/a i $22 = 0x65 (gdb) p/c i $23 = 101 'e' (gdb) p/f i $24 = 1.41531145e-43 (gdb) p/x i $25 = 0x65 (gdb) p/t i $26 = 1100101
当变量改变是停住程序
变化时停住:
watch x
被读时停住:
rwatch x
被读写停住:
awatch x
info watchpoints
4.查看内存
examine=
x
x/<n/f/u> [addr]
n、f、u是可选的参数。 n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。 f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。 u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。 <addr>表示一个内存地址。 n/f/u三个参数可以一起使用。例如: 命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。
5.查看寄存器
info registers
info all-registers包括浮点寄存器
info register eax
print $esp
6.查看堆栈
bt=
backtrace
makefile
陈皓的教程太长了,而且一些东西用不到,看完之后就很快会忘掉推荐阮一峰的这篇
几个例子:
多个文件目录下Makefile的写法
最后,
vpath
VPATH好像是和
%.c
%.h这类搭配使用的
还有一篇关于cmake的:
http://www.leoox.com/?p=264
参考:
0.1陈皓的blog(gdb):http://blog.csdn.net/haoel/article/category/9197
0.2陈皓的blog(makefile):http://blog.csdn.net/haoel/article/category/9198/1
1.http://www.cnblogs.com/bubbler/p/3915931.html
2.gdb: http://www.2cto.com/os/201303/194230.html
3.gdb: http://blog.csdn.net/mifan88/article/details/7301973
4.gcc: http://www.cnblogs.com/iloveyoucc/archive/2012/08/29/2661851.html
5.makefile: http://www.cnblogs.com/little221/archive/2012/12/02/2798401.html
相关文章推荐
- Two Sum
- 导入内容错误
- linux环境变量
- Java并发编程:深入剖析ThreadLocal
- LeetCode Isomorphic Strings
- QT16 delete data from sqlite database with pushbutton
- web pack的使用事项
- CentOS引发的MySQL问题
- BAT MYSQL BACKUP AND ARCHIVE WITH WINRAR
- 在Windows下安装64位压缩包版mysql 5.7.11版本的方法
- mac下修改环境变量
- 软考五:系统开发与运行
- 让BAT静静的执行(隐藏CMD界面)
- Android开发之触摸事件处理机制详解
- 对照Java学习Swift--闭包(Closures)
- VC++ 绘制简单电子元件
- 227. Basic Calculator II
- Qt15 Update a data from Sqlite database with pushbutton
- 流式布局之2012年语法-------------------CSS3盒模型display:flex
- BAT执行PHP文件(区别于上一篇)