一、gcc/g++
1、背景知识
(1)预处理
去注释
头文件展开
宏替换
条件编译
(2)编译
生成汇编
(3)汇编
生成机器可识别的代码
(4)链接
生成可执行文件或库文件
2、-o 选项 重新命名
gcc(只能编译C语言)
带-o选项后跟文件名,自己命名处理完之后的文件名
test.c 放前面最后都可以
3、ESc选项
带 -E选项:告诉gcc,现在开始进行程序的翻译,当做完预处理就停下来。
带 -S选项:告诉gcc,现在开始进行程序的翻译,当做完编译就停下
带 -c选项:告诉gcc,现在开始进行程序的翻译,当做完汇编就停下
此时.o文件还是不能执行,因为还没有经过链接。
链接:将可重定位二进制文件和库进行链接形成可执行程序。
记忆:
指令:ESc(电脑的Esc键)
后缀:iso(镜像文件)
二、动静态库
动态库:共享库,跳到库中执行,执行完再返回调用处。动态库不能缺失,一旦对应的动态库缺失,影响的不止一个程序,可能导致很多程序都无法正常运行。
静态库:静态库进行静态链接时,会将自己的方法拷贝到目标程序中,改程序以后不用再依赖静态库。
Linux中的静态库需要自己安装:
C语言:
sudo yum install -y glibc-static
C++:
sudo yum install -y libstdc++-static
gcc默认优先动态链接。
如果没有静态库,又带 -static,是无法进行静态链接的;
如果没有动态库,只有静态库,这时就算没有-static,也是可以进行静态链接的。
所以, -static的本质是改变优先级。
一个可执行程序可能既有静态链接又有动态链接。
动vs静
库文件其实就是源文件经过一定的翻译+打包——不用给你提供太多的源文件,也可以达到隐藏源文件的目的。
头文件提供方法的声明,库文件提供方法的实现+你的代码 = 你的软件。
库存在的价值就是不用做很多重复工作。
三、gdb调试器
背景:
(1)debug和release:debug可以调试(形成可执行程序时会有调试信息),release不可以。Linux下默认是release版本。如果要以debug版本发布,带-g选项。
指令:
(1)进入调试:
gdb 可执行程序名
(2)退出调试:
q
(3)怎么看到代码:
list(l)行数
也可以跟函数名:
(4)
打断点:b 行号(如果是多文件, b 文件名 行号)
查看断点信息:info b
第一行是断点的编号,删的时候只能根据编号删
删断点:d 编号
(5)开始调试:r
n:逐过程
s:逐语句
p 变量名:看这个变量的值
display 变量名:常显示变量,每次变化同步打印出来。
undisplay 编号:取消该变量的常显示。
until 行数:快速走过一个代码块,运行到指定行,如跳过一个for循环。
finish:走完当前函数后停下来。
c:运行到下一个段点后停。
disable 编号:保留断点但不用(禁用)。
enable 编号:启用断点。
set var 变量名:设置某个变量的值
bt:看函数的调用堆栈
info locals:查看当前栈帧局部变量的值。