Linux 系统上 C 程序的编译与调试(make、gdb)_linux c/c++ cmake release 保存调试信息-程序员宅基地

技术标签: Linux  linux  


Linux系统上 C 程序的编译与调试需要用到gcc,这里就不详细介绍gcc的安装,程序编译链接过程在下面的链接中。

详情请点击↓

程序编译链接过程

提示:以下是本篇文章正文内容,下面案例可供参考

一、Linux 系统上 C 程序的编译

C程序的编译需要四部:预编译、编译、汇编、链接

其分布命令如下:

$ gcc -E main.c -o main.i //预编译
$ gcc -S main.i -o main.s //编译
$ gcc -c main.s -o main.o //汇编
$ gcc -o main main.o      //链接

也可以一步完成:

$ gcc -o main main.c

二、make && makefile文件

make 管理工程实现自动化编译 (和 vs 比较)示例:
对 main.c add.c max.c 三个文件进行编译

文件展示:
add.h:

 int add( int x, int y);

add.c:

 int add( int x, int y)
 {
    
     return x + y;
 }

max.h:

 int max( int x, int y);

max.c:

 int max( int x, int y)
 {
    
     return x > y ? x : y;
 }

main.c:

#include<stdio.h>
#include"add.h"
#include"max.h"

int main()
{
    
     int x = 2;
     int y = 5;
     printf("x = %d,y = %d\n",x,y);
    printf("add = %d\n",add(x,y));
    printf("max = %d\n",max(x,y));
    return 0;
}

makefile文件:

all : main
 
main : main.o add.o max.o
     gcc -o main main.o add.o max.o
 
main.o : main.c
    gcc -c main.c
 
add.o : add.c
    gcc -c add.c

max.o : max.c
    gcc -c max.c

clean :
    rm -rf *.o main

make的使用:

make 命令根据 makefile 文件的规则生成可执行程序
在这里插入图片描述

三、gdb调试

3.1 Debug 版本和 Release 版本

Debug 版本:
Debug 版本为可调式版本,生成的可执行文件中包含调试需要的信息。我们作为开发人员,最常用的就是 debug 版本的可执行文件。
Debug 版本的生成:
因为调试信息是在编译过程时加入到中间文件(.o)中的,所以必须在编译时控制其生成包含调试信息的中间文件。
gcc -c hello.c -g —> 生成包含调试信息的中间文件
gcc -o hello hello.o
或者 gcc -o hello hello.c -g
Release 版本:
Release 版本为发行版本,是提供给用户使用的版本。用 gcc 默认生成的就是 Release 版本。
首先将源代码编译、链接生成 Debug 版本的可执行文件,然后通过‘gdb Debug 版本的可执行文件名’进入调试模式。

3.2 单进程、单线程基础调试命令

 l //显示 main 函数所在的文件的源代码
 list 文件名:num //显示 filename 文件 num 行上下的源代码
 b 行号 //给指定行添加断点
 b 函数名 //给指点函数的第一有效行添加一个断点
 info break //显示断点信息
 delete 断点号 //删除指定断点
 disable 断点号 //将断点设定为无效的,不加断点号,将所有断点设置为无效
 enable 断点号 //将断点设定为有效的,不加断点号,将所有断点设置为有效
 r(run) //运行程序
 n(next) //单步执行
 c (continue//继续执行,直接执行到下一个断点处
 s //进入将要被调用的函数中执行
 finish //跳出函数
 q //退出调试
 p val //打印变量 val 的值
 p &val //打印变量 val 的地址
 p a+b //打印表达式的值
 p arr(数组名) //打印数组所有元素的值
 p *parr@len //用指向数组的指针打印数组所有元素的值
 display //自动显示,参数和 p 命令一样
 info display //显示自动显示信息
 undisplay + 编号 //删除指定的自动显示
 ptype val //显示变量类型
 bt //显示函数调用栈
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_47358666/article/details/119053380

智能推荐

TinoyOs和nesC语言-程序员宅基地

文章浏览阅读479次。nesC语言编程基础1.接口NesC程序主要由各式组件(component)构成,组件和组件之间通过特定的接口(interface)互相沟通。一个接口内声明了提供相关服务的方法(C语言函数)。例如数据读取接口(Read)内就包含了读取(read)、读取结束(readDone)函数。接口只是制定了组件之间交流的规范,也就是通过某一个接口,只能通过该接口提供的方法实现两个组件之间的交流。但是接口终归只是接口,只是一组函数的声明,并为包含对接口的实现。1 interface Read<val._nesc语言

漫谈iOS Crash收集框架_swift崩溃处理框架-程序员宅基地

文章浏览阅读1.3k次。为了能够第一时间发现程序问题,应用程序需要实现自己的崩溃日志收集服务,成熟的开源项目很多,如KSCrash,plcrashreporter,CrashKit等。追求方便省心,对于保密性要求不高的程序来说,也可以选择各种一条龙Crash统计产品,如Crashlytics,Hockeyapp,友盟,Bugly等等。 是否集成越多的Crash日志收集服务就越保险? 自己收集的C..._swift崩溃处理框架

java word转pdf 用到了aspose 1.86 破解版jar在链接下面 只提供技术分享 请支持正版_aspose-pdf-17.8.jar-程序员宅基地

文章浏览阅读2.3k次。接上个的博客 这里来写 word转pdf 有两种方式 第一种 是不能带图片的 下载一个jar包就能直接用了第一种:创建项目导入包 复制粘贴代码 ok (包在下面链接中)这个是查看于一个csdn的博主所得 但是不满足需求 只是转换了文字段落 并没有图片和表格转换 非常有研究价值。/** * 将word文档, 转换成pdf, 中间替换掉变量 */ p..._aspose-pdf-17.8.jar

udk开发-稀里糊涂_networkinterfaceidentifierprotocol-程序员宅基地

文章浏览阅读1.4k次。在此情况下,DXE Runtime Driver必须创建一个signal类型的Event,当SetVirtualAddressMap() 被OS调用的时候,该Event将被通知。​ DXE Runtime Driver创建的signal类型的Event所用到的通知函数不允许直接或者间接使用UEFI Boot Services、**UEFI Console Services **或者 UEFI Protocol Services。所有的Set或者Get的值在boot time memory关闭后将会丢失。_networkinterfaceidentifierprotocol

c语言中struct和typedef struct的用法_typedef struct用法-程序员宅基地

文章浏览阅读2.2k次,点赞18次,收藏51次。基本形式在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:struct 结构体名{ 结构体所包含的变量或数组};结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member),比如????struct stu{ char *name; //姓名 int num; //学号 int age; //年龄 char group; //所在学习小组_typedef struct用法

用 .NET 启动你的 DJI Ryze Tello 无人机_c# 大疆sdk-程序员宅基地

文章浏览阅读2.2k次,点赞5次,收藏6次。用 .NET 启动你的无人机_c# 大疆sdk

随便推点

图像处理之常见二值化方法汇总-程序员宅基地

文章浏览阅读10w+次,点赞25次,收藏117次。图像处理之常见二值化方法汇总图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多。越精准的方法计算量也越大。本文主要介绍四种常见的二值处理方法,通常情况下可以满足大多数图像处理的需要。主要本文讨论的方法仅针对RGB色彩空间。 方法一:该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的将像素值设为0(黑色),值大于等于12_二值化

GUI程序开发_gui开发-程序员宅基地

文章浏览阅读1.9k次。JAVA程序设计与应用开发(第2版)——《GUI清华大学出版社》_gui开发

PYTHON实训总结及体会500字,PYTHON实训总结思考建议_python实验体会-程序员宅基地

文章浏览阅读491次。大家好,给大家分享一下PYTHON实训总结及体会1500字,很多人还不知道这一点。这将使你在做实验时的难度加大。然后两下子就将实验报告做完。但学到的知识与难度成正比。一定要将课本上的知识吃透。【篇一:实验心得体会】就像以前做物理实验一样。在老师讲解时就会听不懂。你要清楚电桥的各种接法。这将使你极大地浪费时间。在做测试技术的实验前。因为这是做实验的基础。_python实验体会

ADC参数详解_adc电流电压零漂值-程序员宅基地

文章浏览阅读9.6k次,点赞9次,收藏117次。特性或指标总述本文将从以下特性进行简单的叙述。结合了《ADC设计基础》和TI的一些教学视频。分辨率转换误差转换速度采样率奈奎斯特采样准则混叠和抗混叠滤波器DNLINL热噪声谐波失真THDSNRENOBSFDRIMD孔径抖动孔径延迟奈奎斯特区补充分辨率一般ADC都说注明是8bit,16bit或者是24bit。这里的数值也就是分辨率的意思。分辨率是衡量A..._adc电流电压零漂值

服务器阵列卡缓存显示错误,服务器阵列卡(缓存)-程序员宅基地

文章浏览阅读1.1k次。RAID卡介绍:提到RAID卡就不得不提到什么是RAID。RAID是英文Redundant Array of Independent Disks的缩写,翻译成中文即为独立磁盘冗余阵列,或简称磁盘阵列。简单的说,RAID是一种把多块独立的硬盘(物理硬盘)按不同方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据冗余的技术。组成磁盘阵列的不同方式成为RAID级别(RAID..._把raid缓存强制开启 显示参数无效

您绝对不能错过的 10 个 OKR 示例!_优秀的okr案例-程序员宅基地

文章浏览阅读429次,点赞6次,收藏8次。在此基础上,制定团队 OKR,它可以是产品层面的或部门层面的,但它们会融入组织的目标中。使用 OKR 方法的一个巨大好处是,它可以针对不同的部门和团队进行细分, 以便整个公司追求相同的组织目标,但利用特定的关键结果。如果您没有达到 100% 的关键结果,您仍然应该为实现这一目标所付出的努力感到自豪,评估是否需要进行更改,并重新调整下一个周期的目标和关键结果。令人惊讶的是,伦敦商学院进行的一项研究显示,在接受调查的 11,000 名高级管理人员中,只有三分之一能够列出他们公司的三大优先事项。_优秀的okr案例

推荐文章

热门文章

相关标签