栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

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

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

编译器+gdb+make/Makefile+git
  • 程序编译
  • 1)编译器
      • gcc
        • 预处理
        • 编译
        • 汇编
        • 连接
        • 函数库
          • 静态库
          • 动态库
      • g++
  • 2)gdb
      • 操作
  • 3)初识make/Makefile
      • 使用
      • makefile实现程序编译全过程
  • 4)git

程序编译

过程:

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库文件)

参考: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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/513180.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号