c文件的编译
安装环境(centos 7)
检查命令是否齐全
gcc --version
g++ --version
gdb–version
安装命令
yum -y install gcc-c++
安装g++命令(用于编译c/c++文件)
yum -y install gcc
安装gcc命令(用于编译c文件)
每个都出现版本号,证明已经安装成功
直接生成可执行文件
gcc 文件名 -o 生成文件名
一定要将命令写对,命令参数的顺序写对
预处理
g++ -E 源文件名 生成文件名.i
1.将头文件展开
2.宏替换
3.内联函数替换
4.注释省略
5.进行条件编译,#ifdef,#ifndef,#endif 等
6.生成.i文件
编译
g++ -s 生成文件名.i -o 生成文件名.s
1.汇总函数符号生成符号表
2.扫描,语法分析,语义分析,源代码分析,目标代码生成,目标代码优化
3.生成.s文件
汇编
g++ -c 生成文件名.s -o 生成文件名.o
1.转为二进制
2.虽然汇编是转成二进制,但是也会进行相应的检查,如果有函数只定义如果没有实现就会在这里发生报错
3.生成.o文件
链接
g++ -o 可执行文件名 -o 生成文件名.o
1.将各个文件进行链接,符号表进行对应,查找各个函数的地址,生成可执行文件
2.静态链接和动态链接
如果代码没有错误,最后会成功生成可执行文件
ldd 可执行文件名
查看文件的链接情况
windows | linux | |
---|---|---|
动态链接 | .dll | .so |
静态链接 | .lib | .a |
makefile
1.写入makefile文件
mybin:main.c
gcc -g main.c -o mybin
# 两者是等价的
# gcc -o $@ $^
# gcc -o mybin main.c
.PHONY:clean
clean:
rm -r mybin
2.使用make
生成文件
make命令的时间对比是和上次修改的时间做对比,如果从上次make之后没有修改就不用生成新的(前提是make命令后生成的文件存在的情况下,如果不存在也是要重新生成的)
3.使用make clean
进行文件的删除
gdb调试工具
gdb的安装
gdb的启动
1.使用-g
添加可调式权限
gcc -g 源文件名 -o 生成可执行文件名
2.gdb 可执行文件名
进入调试界面
gdb调试命令
1.l [数字]
没有数字就从main开始,有数字就从头开始
有人说我为什么只有这么点儿代码,我的代码被吃了吗?
确实和我们想的不一样
我们只需要按回车,他就能把代码全部显出来,直到最后
2.r
直接运行程序
3.b [行号]
在指定行打断点
运行到断点处会停下来
如果我写一个死循环,会发生什么
他不会停下来
强制退出还是在gdb中,并且会显示从哪里跳出来的
info b
查看断点
d [断点编号]
只能通过断点编号才能将断点进行删除
n
逐过程
s
逐语句(进入函数)
逐过程
逐语句
disable/enable
停用断点/启用断点
在21行添加的断点,运行,强制停止运行的时候,从26行跳出,证明21行的断点已经停用
运行,启用断点,逐过程,到达23行,证明断点启用成功
c
跳到下一个断点的位置
finish
运行完一个函数
在21行停下来,逐语句执行,进入函数到13行,然后finish命令直接跳到函数结束,证明是将函数执行完
bt
调用堆栈
进入21行函数,调用堆栈,可以看见两个函数
display 变量名,取地址
常显示监视变量
undisplay [变量编号]
取消常显示
常数2也是可以进行监视的,并且需要取消监视的时候,可以连续取消多个监视
until 行号
直接跳到某一行
如果中间有断点还是要停下来的
从第17行直接跳到23行
set var 变量名=value
强制改变某个变量的值进行调试
批量化注释和取消
1.注释
ctrl+v
选中要注释的列
shift+i
//
ESC
2.取消注释
ctrl+v
选中需要注释的列
使用方向键进行选择需要取消注释的列(hjkl–左,下,上,右)或者使用方向键
d
查找命令
1.查找文件
find 路径 -name 文件名
2.查找命令
which 命令
(ls,pwd,cd)
3.查找安装的文档,压缩包,头文件
whereis 头文件/压缩包/下载的文档
给用户分配权限
vim /etc/sudoers
这里原本(文档的100行左右)是没有user1的,我们按照上root写的形式抄下来,将名称给改成需要分配权限的用户