Linux----编译器+gdb+初识make/Makefile+git

Posted 4nc414g0n

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux----编译器+gdb+初识make/Makefile+git相关的知识,希望对你有一定的参考价值。

程序编译

过程:

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)

编译过程为扫描程序–>语法分析–>语义分析–>源代码优化–>代码生成器–>目标代码优化
(语法分析的结果为分析树parse tree或者语法树syntax tree)
死代码删除是编译最优化技术,指的是移除对程序运行结果没有影响的代码

  1. 汇编(生成机器可识别代码)
  2. 连接(生成可执行文件或库文件)

参考:C语言----程序编译(预处理)

1)编译器

gcc

语法gcc [选项] 要编译的文件 [选项] [目标文件]
选项

  1. -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  2. -S 编译到汇编语言不进行汇编和链接
  3. -c 编译到目标代码
  4. -o 文件输出到 文件
  5. -static 此选项对生成的文件采用静态链接
  6. -g 生成调试信息。GNU 调试器可利用该信息
  7. -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库
  8. -O1 -O0 -O2 -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  9. -w 不生成任何警告信息
  10. -Wall生成所有警告信息

预处理

相当于宏替换
gcc –E [文件名] –o [文件].i

  1. 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程
  2. 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序

编译

相当于生成汇编
gcc –S [文件].i –o [文件].s


可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码

汇编

相当于生成机器可识别代码
gcc –c [文件].s –o [文件].o


使用选项“-c”可将汇编代码转化为“.o”的二进制目标代码

连接

相当于生成可执行文件或库文件
gcc [文件].o –o [文件]


函数库

像printf这种库函数 系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用
函数库一般分为静态链接和动态链接两种

静态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a
本质就是:将库函数里的代码拷贝到自己的可执行程序中

动态库

动态库在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库 gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示,用ldd和file命令验证

g++

针对c++和gcc语法一样


2)gdb

gdb [文件]
(注意此可执行文件是在gcc编译时加了 -g选项的debug版本,不加-g默认是release版本)


操作

  1. list 行号显示binFile源代码,接着上次的位置往下列,每次列10行

  2. list 函数名列出某个函数的源代码

  3. r或run运行程序

  4. n 或 next单条执行

  5. s或step进入函数调用

  6. break(b) 行号在某一行设置断点

  7. break 函数名在某个函数开头设置断点

  8. info break查看断点信息

  9. finish执行到当前函数返回,然后停下来等待命令
    (注意main函数里不能finish)

  10. print (p)打印表达式的值,通过表达式可以修改变量的值或者调用函数

  11. p 变量打印变量值

  12. set var修改变量的值

  13. continue(或c)从当前位置开始连续而非单步执行程序

  14. run(或r)从开始连续而非单步执行程序

  15. delete breakpoints删除所有断点

  16. delete breakpoints n删除序号为n的断点

  17. disable breakpoints禁用断点

  18. enable breakpoints启用断点1

  19. info(或i) breakpoints查看当前设置了哪些断点

  20. display 变量名跟踪查看一个变量,每次停下来都显示它的值

  21. undisplay 编号取消对先前设置的那些变量的跟踪

  22. until X行号跳至X行

  23. breaktrace(或bt)查看各级函数调用及参数

  24. info(i) locals查看当前栈帧局部变量的值

  25. quit退出gdb


3)初识make/Makefile

使用

Makefile自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编译
make是一个解释makefile中指令的命令工具,许多IDE都有这个工具

如下命令
gcc test.c -o mytest
依赖关系 mytest依赖于test.c
依赖方法 gcc命令可以认为是依赖方法

创建一个makefile文件:
touch Makefile/makefile (可以首字母大小写)
.
mytest:test.c
一个Tab gcc test.c -o mytsest
.PHONY:clean(.PHONY定义伪目标):伪目标总是可以执行
一个Tab rm -f mytest

$^$@

一样的效果

makefile实现程序编译全过程

make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make不会理睬


缓冲区
缓冲区本质是一段内存空间暂存临时数据在合适的时候刷新出去
刷新策略

  1. 直接刷新,不缓冲
  2. 缓冲区写满,再刷新,全缓冲
  3. 碰到’\\n’就刷新,行刷新
  4. 强制刷新(把数据真正的写入磁盘文件显示器网络等设备或文件)

回车、换行、回车+换行

  1. 回车:回到行首\\r
  2. 换行:新起一行,不回到行首
  3. 回车加换行:新起一行,同时回到行首键盘上的ENTER键)('\\n')

利用回车写一个倒计时程序

在这里插入代码片

4)git

以上是关于Linux----编译器+gdb+初识make/Makefile+git的主要内容,如果未能解决你的问题,请参考以下文章

Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件

《Linux从0到99》四 Linux编译器(gcc/g++)和调试器(gdb)

《Linux从0到99》四 Linux编译器(gcc/g++)和调试器(gdb)

Linux下gcc编译器和gdb调试

Linux环境开发工具gdb调试工具+Makefile自动化构建工具

Linux编译器gcc/g++调试器gdb项目自动化构建工具make/Makefilegit