gcc/makefile/gdb常用命令

常用命令

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












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值