• linux关于cmake,makefile和gdb的使用


    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 可执行文件名查看文件的链接情况

    windowslinux
    动态链接.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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    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写的形式抄下来,将名称给改成需要分配权限的用户

  • 相关阅读:
    Spring Boot
    【Numpy】numpy.mean() 的用法
    Ubuntu22.04离线安装uwsgi问题记录
    bean的生命周期
    Yolov8小目标检测(24): 最新开源移动端网络架构 RepViT | RepViTBlock | 清华 ICCV 2023
    Java对象传递和返回的细节问题
    Vue 核心Ⅳ(内置指令和自定义指令)
    经典卷积神经网络 - GoogLeNet
    对于GitHub的浅显理解-以TensorFlow项目为例
    2023-2028年中国硫酸钇市场发展态势及前景预测报告
  • 原文地址:https://blog.csdn.net/2201_76033304/article/details/134416482