您的位置:首页 > 其它

gcc/makefile/gdb常用命令

2011-11-25 18:36 316 查看

常用命令

indent自动调整C代码的缩进格式,默认下使用GNU风格
gcc编译器:源文件(c)-----------预处理------>预处理输出文件(.i)-------编译----->汇编文件(.s)---------汇编------>目标文件(.o)----------连接-------->可执行文件(.out)
gcc -S hello.c 输出hello.s
gcc-c hello.c b.c 输出hello.o b.o
gcc hello.c 默认输出a.out

gcc -o hello hello.c 输出hello.out

连接时的“库文件”

标准函数库文件linux系统位置:/lib/ /usr/lib/
标准头文件位置:/usr/inclue/
不过gcc默认情况下只搜索标准C语言库/标准C头文件,仅吧库文件放在标准目录中行不同。如果是头文件,需要加上-l dir,库文件加上-L dir(若-L . 搜索的时候增加当前目录)

静态和共享函数库:

调用静态函数库中的某个函数,首先找到定义该函数的头文件,然后从库文件搜索路径中寻找对应的函数,只将使用到的函数加入生成的可执行文件中。
共享方式,只包含一个函数引用,好处是整个内存中值保存一份拷贝,并且文件/usr/lib/libm.so是对实际库文件修订版(/usr/lib/libm.so.N,N为版本号)的符号链接,这样它的更新独立于用它的应用程序。并且,linux启动应用程序时,它会考虑应用程序需要的函数库版本,以防止新的主版本函数库使旧的应用程序不能使用。
对linux系统,负责装载共享库并解析客户程序的函数应用的程序(动态装载器)是ld.so,也可能是ld-linux.so.2/ld-linux.so.1.搜索共享库的其他位置可以在文件/etc/ld.so.conf中配置,如果修改了这个文件,就需要用命令ldconfig来处理。我们可以通过运行工具ldd来查看程序需要的共享库。
共享库在许多方面类似Windows中使用的动态链接库。.so库对应于.DLL文件,在运行时加载,而.a库类似与.LIB文件,包含在可执行文件中。

下面看一个生成自己的库文件的示例

pro1.c 包含函数pro1
pro2.c 包含函数pro2
lib.h 头文件,包含函数pro1和函数pro2的声明
用ar crv libfoo.a pro1.o pro2.o可生成静态库文件libfoo.a,如果该库文件放在当前目录下,当另一个程序include头文件lib.h的时候,连接时候的命令是
gcc -o pro pro.o -L . libfoo.a(-L 表示搜索库文件的路径加入当前路径)

nm命令可以用来擦汗看目标文件/函数库/可执行文件里包含的函数。

make工具

一个Makefile文件有一系列的make规则,每条make规则的格式是:
目标(target): 依赖(dependency)文件列表
<TAB>命令(command)列表

target:即make最终要创建的文件
dependency:通常是编译目标文件所需要的其他文件,如.c .h .o 等
command: make执行的动作,每个命令占一行,可通过“\”换行

一个Makefile文件:

test: prog.o code.o
gcc -o test prog.o code.o
prog.o: prog.c prog.h code.h
gcc -c prog.c -o prog.o
code.o: code.c code.h
gcc -c code.c -o code.o
clean:
rm -f *.o


make执行的时间戳检查过程:

make根据一个target所依赖文件时间戳决定是否需要执行一个target
如果命令行输入make,默认执行第一个target test。test依赖prog.o code.o,make会往后检查是否有有和prog.o同名的target,如果有,则检目标prog.o的依赖的时间戳,以决定是否要执行target prog.o;如果没有,则开始直接检查这些依赖文件的时间戳。这样一个递归的过程。

make中的变量

自定义变量:定义OBJ=prg.o code.o 使用${OBJ}
环境变量 : 直接使用
预定义变量
自动变量

预定义变量含义
$@当前目标文件的名字,如应用于创建库函数时,它的值就是库文件名
$?比当前目标文件新的依赖文件(即当前目标文件所依赖的那些文件)列表
$<比当前文件新的第一个依赖文件文件
$^用空格隔开的所有依赖文件(重复出现的文件名只有一个,如果有的话)
GNU 调试工具 gdb

设置断点 break<行号> break<函数名> 多文件break<文件名:行号>break<函数名> 条件 break<行号/函数名> if <条件表达式>

单步执行 step(进入函数)/ next(不进入函数)

查看源代码: list 默认显示当前行附近10行,list [m, n]

查看帮助文档:help

监视程序中的变量: print whatis

设置变量的值: set

两篇常见C错误gdb调试实战:http://www.diybl.com/course/6_system/linux/Linuxjs/200875/130421.html

http://blog.chinaunix.net/space.php?uid=317451&do=blog&id=92412
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: