学习笔记 ----liunx gcc(动静态链接,debug/release版本编译)、gdb(基础调试系列指令)、makefile/make(依赖关系,依赖方法及相关问题)、使用详解。

个人的某天学习笔记、以下都是满满的干货:

简单命令:rm
删除以sum开头的文件 rm sum 这里的‘*’ 称为通配符。*

gcc的使用细节

gcc 默认连接方式 ---->动态链接,release版本(不支持调试)
生成debug版本可执行: gcc test.c -o test -g
以静态链接的方式生成 :gcc test.c -o test -static
编译时去掉全部的waring :加 -w 例如 gcc test.c -o test -static -w
显示所有的-Wall

编译时的优化(例如 递归优化为迭代):分为三级 -O1/2/3 例 gcc test.c -o test -static -w -O3 (优化三级)
动态库以.so结尾
静态库以.a结尾
库的真正名称是:去掉前缀lib 和后缀,例如libc.so c库
动态链接: 跳转到库函中执行我们的代码.
缺点:1.效率低一点 2.对库的依赖性强
优点:文件大小比静态链接的文件小的多

静态链接:将库中的代码拷贝一份到自己的代码中。(文件比较大)
缺点:生成的程序体积较大
优点:不依赖任何的第三方库,自己就可以直接运行。可移植性高。

linux :文件类型不以后缀作为区分

命令:ldd 检查一个可执行程序所依赖的库
file 检测文件更详细的属性 例:file test

gcc -o test test.c -static 静态链接的方式进行链接(默认是动态链接)

快捷键:ctlr + R 输入命令(查找历史命令)

gdb调试器使用

gdb(基础命令):
debug版本(体积大一些) :(原因) 添加了调试信息 ,可以调试
release版本 : 没有调试信息 —> 该版本不能调试
退出gdb:输入 quit
查看当前代码 :命令 :l
打断点:1. b 加行号 例 b 15
2. 函数前打断点 b 函数名

让程序继续执行(会在下面的第一个断点处停下):r
进入一个函数:step 简写 ----> s
单步执行 : next 简写 —> n
回车默认是上一条命令。
查看信息 : p (只显示一次,下次想看时还需重新输入) 例如 查看 i的值: p i
display 常显示(经常显示)例如:diaplay sum ,之后每执行一步都会显示sum的信息,并且是动态变化的
undisplay (取消显示) undisplay [查看值所在的列表的号码]
例: 调试信息有
3:sum = 12
1:i = 29
现在取消sum的显示,则命令为:undisplay 3

查看所有断点:info b
跳出当前函数(执行完函数的内容):finish

直接跳到指定行:until ---->跳到17行 则为:until 17,中途遇到断点会停下。
删除一个断点: d 【断点号码】

从这里直接到下一个断点:命令 c (若后面没有断点,则程序直接运行完毕)

Makefile / make

makefile主要内容:依赖关系,依赖方法
make是一条指令,Makefile是一个文件
例:
目前有一个sum.c的文件
步骤:

  1. touch makefile
  2. vim makefile (打开编辑)
    依赖关系:
    左边(目标文件):右边(依赖文件)
    依赖方法:
    必须以tab键开头

为了体现过程,我们将sum.c的makefile 文件写为如下:

sum:sum.o
	gcc -o sum sum.o
sum.o:sum.s
	gcc -c sum.s -o sum.o
sum.s:sum.i
	gcc -S sum.i  -o sum.s
sum.i:sum.c
	gcc -E sum.c -o sum.i

.PHONY(伪目标):clean
clean:			//clean 没有依赖关系,有依赖方法
	rm -f sum.i sum.o sum.s sum

上面的代码可替代为:

sum:sum.c
	gcc -o sum sum.c
.PHONY:clean
clean:
	rm -f sum

保存退出后:
对当前项目进行编译:命令 make
清空当前生成的目标文件:make clean

被 .PHONY修饰的叫做伪目标,特点是:伪目标总是被执行
什么叫总是被执行:就是无论什么是时候我们去执行make,伪目标对应的命令都会被执行 .
问题:为什么为伪目标总是被执行?
个人理解(希望大家提出意见):
当生成的文件没有被删除的时候,再去make会提示当前的可执行程序是最新的,但是当们改变了源文件的内容时,
尽管我们没有执行make clean ,却仍然可以成功执行make,原因是因为,编译器去执行make时,会去看源文件的改动时间是否发生变化,变化说明
代码被改动,此时就有了重新编译的必要。
但是为什么伪目标总是被执行的,那是因为伪目标在执行时没有去看文件的日期是否变化,直接执行命令。
问题:vim刚进入是什么模式?
vim (刚打开是命令模式)

发布了70 篇原创文章 · 获赞 12 · 访问量 9770

猜你喜欢

转载自blog.csdn.net/lovehang99/article/details/102687758
今日推荐