Linux工具(gcc/g++ and gdb)

请添加图片描述

gcc(Linux下的编译器)

预处理

命令:

gcc -E 文件名.c -o 文件名.i
例:gcc -E test.c -o test.i
该命令的意思是:test.c文件完成预处理之后就停下来,输出到test.i文件中去(-o 选项就是文件输出到文件的作用)请添加图片描述

预处理阶段完成的事:
1.头文件的展开
2.完成宏替换
3.删除注释
4.完成条件编译

编译

命令:

gcc -S 文件名.i -o 文件名.s
例:gcc -S test.i -o test.s
该命令的意思就是,test.s文件完成编译的工作(将c语言代码转成汇编码)后,就停下来,然后输出到文件test.s去。
请添加图片描述
请添加图片描述
我们可以看到main函数里面的代码已经变成了汇编代码

编译阶段完成的工作:
1.语法分析
2.词法分析
3.词义分析
4.符号汇总

汇编

指令:

gcc -c 文件名.s -o 文件名.o( 文件名.obj)
例:gcc -c test.s -o test.o(test.obj)
该命令的意思就是,文件test.s完成汇编(将汇编代码转成计算器能看懂的二进制机器码)的工作之后,就停下来,然后输出到文件test.o去
请添加图片描述
执行完上面的命令,我们vim进入test.o 看到的都是二进制机器码

汇编完成的工作:
1.生成符号表

链接

指令:

gcc 文件名.o -o 文件名
例:gcc test.o -o test
该指令直接执行即可,会自动与函数库进行连接(一般是动态库,即动态链接),若我们没有指定文件名,生成的文件名一般为a.out

链接部分完成的工作:
1.合并锻表
2.合并和重定位符号表

函数库
  • 函数库:函数库是由系统建立的具有一定功能的函数的集合。库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息。用户也可以根据自己的需要建立自己的用户函数库。
  • 库函数:存放在函数库中的函数。库函数具有明确的功能、入口调用参数和返回值。
  • 连接程序:将编译程序生成的目标文件连接在一起生成一个可执行文件。
  • 头文件:有时也称为包含文件。C语言库函数与用户程序之间进行信息通信时要使用的数据和变量,在使用某一库函数时,都要在程序中嵌入(用#include)该函数对应的头文件。 --百度百科
动静态库
  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello

链接静态库就称为静态链接,链接动态库就是动态链接。
例:
就好像我们在宿舍要洗衣服一样,假如我们宿舍没有洗衣机,我们每次洗衣服的时候就需要跑到公共洗衣房去使用公共洗衣机(就好像我们要使用printf这些库函数的时候,就要去函数库里面去找,用的时候去动态库去找,用的时候再找);而当我们宿舍自己买了洗衣机的时候,我们每次洗衣服就不用再跑去公共洗衣房去使用洗衣机了(就好像我们链接静态库一样,有了静态库之后,我们就不再需要库文件了,不用再每次要使用库函数的时候就链接动态库,直接使用静态库就好了)。

动态链接:

  • 优点:省空间 文件体积小 加载速度快
  • 缺点:依赖动态库 程序可移植性较差

静态链接:

  • 优点:不依赖第三方库 程序的可移植性较高
  • 缺点:浪费空间

静态链接的指令:

gcc 文件名.o -o 文件名 -static
例:gcc test.o -o test_static -static

如果我们没有下载静态库,直接运行这个代码就会报错

/usr/bin/ld: cannot find -lc
collect2: error: ld returned 1 exit status

我们只需要在我们linux下载一下静态库就好了
指令:

sudo yum install -y glibc-static libstdc++-static

然后就可以进行静态链接了
请添加图片描述

注:
gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。
请添加图片描述
也可以同ldd去查看可执行文件所依赖的库
请添加图片描述
/lib64/libc.so.6就是c语言标准库

gcc选项

gcc选项

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

gdb(Linux下的调试器)

注:

  • 程序的发布方式有两种,debug模式和release模式
  • Linux gcc/g++出来的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

gcc -g test.c 或gcc -g test.c -o 文件名

  • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
  • list/l 函数名:列出某个函数的源代码。
  • r或run:运行程序.
  • n 或 next:单条执行。 (类似于vs22下的单步调试F10)
  • s或step:进入函数调用 (类似于vs22下的逐步调试F11)
  • break(b) 行号:在某一行设置断点
  • break 函数名:在某个函数开头设置断点
  • info break :查看断点信息。
  • finish:执行到当前函数返回,然后挺下来等待命令
  • print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • p 变量:打印变量值。
  • set var:修改变量的值
  • continue(或c):从当前位置开始连续而非单步执行程序
  • run(或r):从开始连续而非单步执行程序
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点
  • disable breakpoints:禁用断点
  • enable breakpoints:启用断点
  • info(或i) breakpoints:参看当前设置了哪些断点
  • display 变量名: 跟踪查看一个变量,每次停下来都显示它的值 (类似于vs22,我们的调试窗口,输入变量名,就可以一直查看他的变化)
  • undisplay:取消对先前设置的那些变量的跟踪
  • until X行号:跳至X行
  • breaktrace(或bt):查看各级函数调用及参数
  • info(i) locals:查看当前栈帧局部变量的值
  • quit:退出gdb
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值