GCC+makefile+GDB工具

2023-11-06

GCC编译器

以c文件main.c,sub.cadd.c和头文件my_fun.h为例,代码为

  1 //main.c
  #include<stdio.h>
  2 #include<add.h>
  3 #include<sub.h>
  4 int main()
  5 {
  6   int num1,num2;   //定义两个数字
  7   int sum,diff;   //和   差
  8   printf("你好,请输入两个数:\n");
  9   scanf("%d%d",&num1,&num2);
 10   sum = add(num1,num2);
 11   diff = sub(num1,num2);
 12   printf("%d+%d=%d\n",num1,num2,sum);    
 13   printf("%d-%d=%d\n",num1,num2,diff);
 14   return 0;
 15 }                                                                      		         					
  //add.c
  //add函数的定义
  1 int add(num1,num2)
  2 {
  3   return num1+num2;
  4 }
//sub.c
//sub函数的定义
  1 int sub(num1,num2)
  2 {
  3   return num1-num2;                                                                                     
  }
//函数的声明
int sub(int num1,int num2);
int add(int num1,int num2);

四大步奏:

  1. 预处理

    • 预处理指令执行 gcc -E *.c

      头文件的引入 #include

    • 宏展开

举例: gcc -E *.c 或者gcc -E main.c
图片截取部分
在这里插入图片描述

  1. 预编译

  2. 编译

    生成目标文件: gcc -c *.c [ -o 指定名称 ]
    举例:gcc -c *c
    在这里插入图片描述

  3. 链接

    gcc main.o add.o sub.o [ -o 指定名称]

    gcc *.o [-o 指定名称]

举例:gcc main.o sub.o add.o

在这里插入图片描述

执行./a.out

上述步骤也可以一步到位:
gcc *.c
在这里插入图片描述

GDB调试工具

GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统系统下、基于命令行的、功能强大的程序调试工具。
GDB的命令有很多,本文只列举一小部分命令,大致完成基本的程序调试工作。

gcc *.c -g

  1. 进入GDB模式

    1. gdb 文件名
      例如:gbd a.out
      在这里插入图片描述
    2. 先输入gdb
      再输入file 文件名
      举例:
      在这里插入图片描述
  2. 运行程序run
    支持缩写r在这里插入图片描述

  3. 设置断点breakb
    举例:break main //main函数设置断点
    b 文件名:行号n //在第n行设置断点
    继续执行: continuec
    在这里插入图片描述

  4. 单步调试next

  5. 退出gdb:quitq

makefile的使用

在上面的过程中,使用gcc 一堆繁琐的步奏是不是很让人抓狂?正是如此,我们需要找更为简便的方式。而使用makefile就是为了解决这一问题。

makefile的格式

目标:生成目标的依赖
	生成目标的命令 //注意缩进

demo如下:

  1. 创建makefile文件(vim makefile)
  2. 写入
afu:main.o sub.o add.o   //生成afu文件
       gcc main.o sub.o add.o -o afu  //注意用tab缩进
main.o:main.c
       gcc -c main.c
sub.o:sub.c
       gcc -c sub.c
add.o:sub.c
       gcc -c add.c
clean:
       rm -rf main.o sub.o add.o  //清除这些.o文件

在这里插入图片描述

  1. 运行
    make

在这里插入图片描述

上述就是makefile的基本使用了,但是感觉这样好像比gcc还要复杂,能不能在优化一下?

$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
%:依次对应

所以,根据以上的内容,我们优化:

  1 afu:main.o sub.o add.o
  2   gcc *.o -o $@
  3 %.o:%.c
  4   gcc -c $< -o $@
  5 clean:
  6   rm -rf *.o

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC+makefile+GDB工具 的相关文章

随机推荐

  • 初等模型---光盘的数据容量

    问题分析 光盘的外观尺寸是由些大公司成立的联盟决定的 如CD DVD等盘片的外径为120mm 并且沿外边缘留有2mm宽的环形区域不存储信息 CLV光盘存储信息的内圈直径为45mm 在内外圈之间的环形区域 经过编码的数字信息 以一定深度和宽度
  • MySQL 8用户及权限管理

    文章目录 参考文档 查看权限 安装后 登录测试 添加帐户 分配特权和删除帐户 扩展 创建远程访问新用户并授权 参考文档 官方链接 https dev mysql com doc refman 8 0 en create user html
  • 简单的扫雷程序的实现

    define CRT SECURE NO WARNINGS include
  • js操作时间过当天晚上00:00清除本地存储

    const end new Date new Date new Date toLocaleDateString getTime 24 60 60 1000 1 getTime 当天23 59 59秒 转换成的毫秒数 const start
  • banner切换

    html代码 div div a img src imgs p1 png alt a a img src imgs p2 jpg alt a a img src imgs p3 jpg alt a a img src imgs p4 jpg
  • 【javascript】导航栏

    要实现这样的效果主要有两点 第一 当鼠标经过主导航栏里面的内容就会被放大 鼠标离开后就会恢复原来的样子 第二 当鼠标经过主导航时对应的副导航的内容就会呈现
  • 一个完美的自动化测试框架应该怎么写?

    一 什么是自动化测试框架 自动化测试框架是为自动化测试用例或者脚本提供执行环境而搭建的基础设施 自动化测试框架有助于有效地开发 执行和报告自动化测试用例 优点 代码复用 提高测试效率 更高的测试覆盖率 维护成本低 更早发现和记录bug 二
  • Oracle RAC 更改网卡名称

    如 原网卡eth1 为增加网卡可靠性 把eth1和eth3绑定为bond0 主备模式提供服务 更改名称后RAC会无法启动网络服务 还需要更改的操作如下 u01 app 11 2 0 grid bin oifcfg getif u01 app
  • C#中的this

    一 C 中的this C 中的保留字this仅限于在构造函数 类的方法和类的实例中使用 在类的构造函数中出现的this作为一个值类型 它表示对正在构造的对象本身的引用 在类的方法中出现的this作为一个值类型 表示对调用该方法的对象的引用
  • WSDL(Web服务描述语言)详细解析

    WSDL Web Services Description Language Web服务描述语言 是一种XML Application 他将Web服务描述定义为一组服务访问点 客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服
  • Java:珠穆朗玛峰

    需求 世界最高山峰是珠穆朗玛峰 8844 43米 8844430毫米 假如我有一张足够大的纸 它的厚度是0 1毫米 请问 我折叠多少次 可以折成珠穆朗玛峰的高度 分析 1 因为要反复折叠 所以要使用循环 但是不知道要折叠多少次 这种情况更适
  • 记一次spring循环依赖

    问题 spring循环依赖 场景 A注入B B注入A 按理来说spring是支持的处理 不会出现循环依赖的问题 但是 除了相互注入外 项目还是使用的AOP切面打印日志 使用了代理 问题就是出现在这里 源码 Whether to resort
  • 简单的整理一下Vue3的组合API

    1 Vue3的生态和优势 社区生态 逐步完善 整体优化 性能优化 TS支持优化 组合式API加持 市场使用 部分技术选型激进的公司已经在生产环境使用了vue3 社区生态 组件 插件 名称 官方地址 简介 ant design vue Ant
  • Eclipse远程调式

    JVM调式选项 Xdebug Xrunjdwp transport dt socket address 8000 server y suspend y 请务必写在一行
  • matplotlib画图

    画出第一个基本图像 import matplotlib pyplot as plt import numpy as np x np linspace 1 1 50 y x 2 1 plt plot x y plt show 用两个窗口画出两
  • java 算法结构----单链表

    相关基础知识补充 指针 表示一个数据元素逻辑意义上的存储位置 Java语言用通过对象的引用来表示指针 通过把新创建对象赋值给一个对象引用 即是让该对象引用表示 或指向 了所创建的对象 链式存储结构是基于指针实现的 我们把一个数据元素和一个指
  • 3分钟教你子网划分--(内含习题讲解)

    文章目录 一 IPV4 1 IP地址 2 IPV4地址组成 3 IP地址分类 二 子网掩码 1 网络地址与广播地址 2 子网划分 一 IPV4 1 IP地址 IP地址分为IPV4和IPV6 但现在目前大家所常用的为IPV4 IPV4是由32
  • GPU基数排序(CUDA radix sort)

    GPU基数排序 CUDA radix sort 引言 基数排序是具有固定迭代次数的排序算法 其通过对最低位到最高位的一一比较 对数值排序 本文将介绍基数排序的并行实现方法 主要包括并行基数排序 并行合并 并行归约这三种算法 本文全部代码连接
  • CentOS7.x 安装 openssh8.4、openssl1.1.1

    1 升级准备工作 1 1 查看系统版本和ssh版本 cat etc redhat release ssh V 1 2 需要将openssh升级到最新版本 直接yum安装即可 yum install openssh y 可以看已经升级到7 4
  • GCC+makefile+GDB工具

    GCC编译器 以c文件main c sub c和add c和头文件my fun h为例 代码为 1 main c include