gcc和gdb的使用——Linux

news2025/1/20 1:38:21

Linux学习全部合集点击即可订阅

“人生得意须尽欢”

这里是目录标题

  • gcc的基本操作
  • gcc处理代码的步骤
    • 预处理
    • 编译
    • 汇编
    • 链接
  • 头文件和库
    • 静态库
    • 动态库
  • gdb调试
  • makefile
    • 什么是makefile?
  • 进度条的实现
    • 缓冲区
    • 回车和换行
  • git的使用
    • .gitigonre

gcc的基本操作

编写代码的最基本操作

gcc 文件名
//运行C++代码
g++ 文件名

编译后默认生成的文件是a.out

gcc处理代码的步骤

宏观上的步骤。
实际上是从文本转换为二进制的语言

计算机为什么只认识二进制?
因为计算机中的各种硬件只认识二进制。二进制计算机是现在的主流计算机。

因为gcc和g++的选项都是一样的,所以以gcc为例。

以下这条命令的含义是指定翻译后的文件。
一步到位,直接将文本变为计算机认识的二级制。

gcc test.c -o mytest

预处理

注意:底行模式输入vs test.c 可以实现分屏
ctrl+w可以切换分屏

-E选项的意思就是让程序开始翻译,当预处理完成后,就写到test.i这个文件中,然后停止翻译。-o选项是指定写到某个文件的意思

gcc -E test.c -o test.i

1.主要进行宏替换
2.头文件的展开
3.去掉注释
4.条件编译

预处理工作实际就是做了文本处理的工作。

编译

核心工作就是将C语言翻译成为汇编语言。
汇编语言不需要懂,只要知道和语言不一样就行。

汇编语言的文件一般都是.s
-S进行程序的翻译,编译完成之后就停止下来。

gcc -S test.i -o test.s

汇编助记符,比如movl call 等这些就是汇编语言

汇编

核心工作是将汇编语言翻译成可重定位二进制文件
以.o或.obj结尾。

-c:从现在开始进行程序翻译,当汇编结束后,就停下来。

gcc -c test.s -o test.o

test.o就是二进制文件。

虽然这个.o是一个二进制文件但是并不能运行。
为什么不能执行?因为test.o中还有一些符号没有和系统相关联。
比如我们的printf函数,需要与系统中的C标准库相关联,所以就要用到最后一步链接。

链接

gcc test.o 自动搜索需要用到的库,自动链接。

gcc test.o -o mytest

最后生成了可执行程序mytest。

以下命令可以查看mytest所依赖的库。

ldd mytest

头文件和库

C语言程序写好了,一般需要链接库。

头文件:头文件里一般包含的是函数的声明
。头文件给我们提供了可以使用的方法,所有的开发环境有语法提示,本质是通过头文件帮我们搜索的。

库文件:给我提供了可以使用的方法的实现。

而我们写程序是包含头文件,链接库文件

静态库

在Linux中以.a结尾的,在windows是以.lib结尾的

静态库对应静态链接
相当于把库里的代码直接拷贝到自己的可执行程序里面。

优点:不依赖任何库,程序可以独立运行。
缺点:浪费资源。

动态库

在Linux中动态库是以.so中运行的。在windows中是以.dll结尾的。比如英雄联盟文件里有dll文件。

动态库对应动态链接

动态链接的意思就是在一段程序从上至下运行的过程中,如果某一行用到了某个方法,就去对应的库里调用。

链接是产生关系。不是执行。

优点:所有命令共享同一个库,可以节省资源。
缺点:一旦库缺失,会导致几乎所有的程序失效。

默认情况下,形成的可执行程序就是动态链接的。

如果想生成静态链接就在命令后面加上-static选项。

gcc test.c -o mytest2 -static

假如只写一个helloworld,静态库的文件大小是动态库的一百倍。

所以更推荐使用动态链接。

gdb调试

Linux中gcc 默认生成的realease版本,不能调试。
想要调试则必须要使用debug版本。

在后面加上-g选项即可。

gcc hello.c -o hello_g -g

debug里面包含了很多调试信息。
而realease里面没有调试信息。

gdb hello_g

l main//显示包含main函数的代码

gdb的回车键 可以继续执行上一条指令。

b 15//表示在第15行打断点
info b//查看断点
p 变量名//可以查看变量的值
d 1//表示取消第一个断点。

s可以逐语句的走

s

逐过程的走
next的简写n

n//相当于vs的f10
quit//可以停止调试

bt可以查看调用堆栈。

display相当于vs的监视

display 变量名//可以常显示变量的值
undisplay 序号//取消常显示的变量

until跳转到指定位置

until 行号

从一个断点直接跳到另一个断点,在vs中是一直按f5即可直接跳到下一个断点。

在Linux中命令是
c,全称是continue

c

假如进去一个函数,怎么快速将函数跑完?
finish命令可以完成这个任务

finish

makefile

makefile只要会用就行。在公司里也不用写Makefile,因为公司里面会有自动生成Makefile的工具。

项目构建
1.假如是多文件比如.h.cpp,先编译哪一个程序?
2.链接需要哪些库?
3.库和头文件去哪里找?
4.整个项目结构,该如何?

假如一个项目里存在100个.cpp的文件,你只能把这些文件一个个的编成.o文件。这样很慢。
所以makefile可以解决这个问题。

什么是makefile?

make是一个命令。
makefile是一个文件。

首先需要自己在当前目录下创建一个makefile

然后再makefile里面添加依赖关系和依赖方法。
1.依赖关系:
技巧:iso
mytest 依赖于 test.o
test.o 依赖于 test.s
test.s 依赖于 test.i
test.i 依赖于test.c

1.依赖方法
就是gcc的一些命令

gcc test.o -o mytest
gcc -c test.s -o test.o
gcc -S test.i -o test.s
gcc -E test.c -o test.i

在这里插入图片描述

怎么清理可执行程序?
.PHONY叫做伪目标,是makefile中的一个关键字。被.PHONY修饰事,表示是总是被执行的。
什么意思呢?什么叫做总是被执行呢?
首先看一下什么叫做不被执行。

假如你make了一次,test.c没有更新,则不会再执行make的依赖方法。

总是被执行的意思就是可以一直make,然后可以执行。

伪目标也是目标。
伪目标总是被执行的。

.PHONY:clean
clean:
	rm -rf mytest

所以说clean是可以一直执行的。

makefile是如何识别我的文件是新的还是旧的呢?

一个文件有三个时间
access是访问时间
modify是文件内容修改的时间
change是文件属性修改的时间

修改文件内容可能会引起文件属性的变化,因为内容增加,大小会增加。

**makefile是通过对比test.c的文件和可执行程序mytest的文件内容的修改时间的早晚来确定文件是不是最新的。**假如源文件的时间比较新,则就是test.c的文件比较新。

多文件的makefile编写
假如有文件main.c hello.c hello.h文件
在这里插入图片描述

进度条的实现

Linux提供了一个sleep函数,是按照秒来提供休眠的。

这个程序先在屏幕上打印hello,再睡眠3秒钟结束程序。
在这里插入图片描述C语言的执行程序是从上往下进行执行的。
\n是行刷新,可以给缓冲区进行刷新。

所以直接显示到屏幕上后,在睡眠3秒。

缓冲区

缓冲区指的是哪里的缓冲区?
是缓冲区就说明他是一段内存。只要不刷新,则数据一直在内存中。

怎么才能将内存中的数据刷新出来?
1.行刷新,输入的数据是一行则就刷新出来。
2.flussh(stdout)可以来刷新缓冲区
3.程序结束return 0可以来刷新缓冲区

回车和换行

键盘上的回车键是融合了\r和\n。

实际上的\r是回到行首,叫做回车
\n是换行,就是换行。
严格意义上说,换到新的一行,并不回到行首,叫做换行。

简单进度条代码
注意usleep是微秒来算的
%-100s是按照左对齐预留100个空间

#include<stdio.h>
#include<string.h>
#include<unistd.h>
void test()
{
  char bar[101];
  memset(bar,'\0',sizeof(bar));

  const char* lable = "|/-\\";

  int cnt = 0;
  while(cnt <= 100)
  {
    printf("[%-100s][%d%%][%c]\r",bar,cnt,lable[cnt%4]);
    fflush(stdout);
    bar[cnt++] = '#';
    usleep(20000);
  }
  printf("\n");
}
int main()
{
  test();
  return 0;
}

git的使用

git是什么?
git什么是版本管理?
进行版本控制,来保存历史的记录。

1.gitclone把远程的仓库拉取到本地。

git clone 仓库地址

2.git status可以查看需要提交的文件
3.git add 文件名
4.git commit -m “备注不要瞎写”
5.git push

git commit 命令用来将本地暂存的修改提交到版本库

假如你修改了gitee上的仓库代码,但是本地没修改,是不能git push的。

需要先git pull拉取到本地进行更新本地代码

.gitigonre

这是git文件的黑名单,意味着是这些文件的其中之一就不能进去git的仓库。
这些文件都是垃圾文件。都是动态库,静态库等文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/152192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【工具Share】用VBA获取批量文件中的同一个单元格内容

最近鼓捣了个工具&#xff0c;可以批量从固定文件夹的excel中获取同一个单元格中的具体内容&#xff08;当然&#xff0c;你也可以根据自己的需要&#xff0c;进行多个单元格内容的取得&#xff09; 可能这么说比较抽象&#xff0c;举例来说比如你在多个相同模板的excel中定义了…

java循环结构的概述

在之前的文章中&#xff0c;已经给大家详细地介绍过变量相关的内容&#xff0c;比如变量的概念、命名规范、变量的定义及底层原理等内容。但其实变量还有作用范围的概念&#xff0c;并且根据作用范围的不同&#xff0c;变量还可以分为成员变量、局部变量等内容。在我们今天开始…

Nacos config 配置中心详解

Nacos 提供用于存储配置和其他元数据的 key/value 存储&#xff0c;为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config&#xff0c;您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。Spring Cloud Alibaba Naco…

【算法基础(1)】认识时间复杂度和常用排序算法

1 认识时间复杂度 1.1 什么是时间复杂度&#xff1f; 时间复杂度是一个函数&#xff0c;它定性描述该算法的运行时间&#xff0c;在软件开发中&#xff0c;时间复杂度就是用来方便开发者估算出程序运行时间&#xff0c;通常用算法的操作单元数量来代表程序消耗的时间&#xf…

pageoffice在线编辑word文件并禁止选中

一、整篇文档禁止选中 wordDoc.setDisableWindowSelection(true); //禁止word的选择文字功能 二、根据条件判断是否禁止选中 比如&#xff1a;选中内容超过一定字数&#xff0c;取消选中 解决方案&#xff1a;使用后端提供的OnWordSelectionChange事件。 PageOfficeCtrl po…

sgRNAs基因编辑

CRISPR-Cas9知识学习笔记 https://www.163.com/dy/article/FGCP58KC0532AN5N.html https://crispr.dbcls.jp CRISPR&#xff08;clustered regularly interspaced short palindromic repeats&#xff0c;成簇的规律间隔短回文重复序列&#xff09;和CRISPR-associated protein …

Spring Cloud Gateway服务网关的部署与使用(结合nacos)

一、微服务网关1.什么是微服务网关在传统的单体架构中&#xff0c;我们只需要开放一个服务给客户端调用即可。但是微服务架构中是将一个系统拆分成多个微服务&#xff0c;不同的微服务一般会有不同的网络地址&#xff0c;客户端在访问这些微服务时必须记住几十甚至百个地址&…

springboot多项目结构

微服务的目录结构一般分为如下几个模块&#xff1a; 当我们做的项目稍微大一点之后&#xff0c;就会经常遇到需要把不同的模块分离出来的时候&#xff0c;比如微信的朋友圈、微信支付、聊天服务等模块&#xff0c;像这种微服务项目一般都会把base、common、前端抽离出来。 com…

DP8403国产3W双通道无滤波器D类立体声音频放大器兼容替代CS8403

目标DP8403简介功能框图&#xff1a;DP8403主要特性DP8403简介 DP8403是3W双通道无滤波器D类立体声音频功率放大器芯片&#xff0c;能够以D类放大器的效率提供AB类功率放大器的性能。采用D类结构&#xff0c;DP8403 能够在 4Ω负载和 5V 电源条件下&#xff0c;提供高达 3W 输…

MySQL (五)------数据库三范式、外键约束、多表间关系、多表关联查询、子查询

数据库三范式 好的数据库设计对数据的存储性能和后期的程序开发&#xff0c;都会产生重要的影响。建立科学的&#xff0c;规范的数据库就需要满足一些规则来优化数据的设计和存储&#xff0c;这些规则就称为范式。 1.1 第一范式: 确保每列保持原子性 第一范式是最基本的范式…

深入理解java反射原理

系列文章目录 文章目录系列文章目录前言一、 如何获取反射中的Class对象&#xff1f;二、反射的步骤三、详细解答1. 获取对象类的实例2、newInstance() 的实现方式3、获取Method对象4. 调用invoke()方法。总结前言 反射是在运行状态中&#xff0c;对于任意一个类&#xff0c;都…

C 程序设计教程(10)—— 数据输入函数(scanf)用法详解

C 程序设计教程&#xff08;10&#xff09;—— 数据输入函数&#xff08;scanf&#xff09;用法详解 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门级用户阅读。 目录…

Ubuntu安装PyTango步骤

继续上一篇&#xff1a; https://blog.csdn.net/woshigaowei5146/article/details/128443892?spm1001.2014.3001.5502 环境 虚拟机&#xff1a;VMware Ubuntun&#xff1a;20.04LTS Tango&#xff1a;9.3.5 安装 PyTango作为官方debian/ubuntu包在linux上可用: for Python…

195:vue+openlayers 加载json格式热力图,调节半径大小和模糊程度

第195个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载JSON格式的数据,呈现热力图。这里可以调节热力图的半径大小和模糊程度。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例代码(共100行)headDa…

【JavaGuide面试总结】Java高级特性基础篇·上

【JavaGuide面试总结】Java高级特性基础篇上1.为什么 Java 中只有值传递&#xff1f;2.static 关键字使用场景3.Exception 和 Error 有什么区别&#xff1f;4.Checked Exception 和 Unchecked Exception 有什么区别&#xff1f;5.Throwable 类常用方法有哪些&#xff1f;6.fina…

【Linux】缓冲区理解

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;缓冲区&am…

深入理解ECAPA-TDNN——兼谈Res2Net、ASP统计池化、SENet、Batch Normalization

概述 ECAPA-TDNN是说话人识别中基于TDNN的神经网络&#xff0c;是目前最好的单体模型之一关于TDNN&#xff0c;可以参考深入理解TDNN&#xff08;Time Delay Neural Network&#xff09;——兼谈x-vector网络结构 ECAPA-TDNN TDNN本质上是1维卷积&#xff0c;而且常常是1维膨…

【Django项目开发】角色管理模块的开发(八)

文章目录一、序列化器设计1、嵌套的序列化器设计2、普通的序列化类支持&#xff1a;新增、修改角色名、删除、查询3、用于给某一个角色批量授权的序列化4、用于给某一个角色单一授权&#xff0c;包括取消单一授权二、视图类设计1、包含的接口有哪些2、set_permission_to_role方…

听说……国产的领航辅助驾驶系统都很卷?

什么是城市NOA功能&#xff1f; 基于国产芯片的城市NOA功能有看点吗&#xff1f; 国产芯片发展到了什么阶段&#xff1f; 车上配的激光雷达是不是越多越好&#xff1f; 车企常吹的“数据驱动”、“中央计算” 究竟是真是假&#xff1f; ……最近&#xff0c;两家中国公司组CP 推…

基于ros将文件夹中的图像转换为bag包(c++版本)

一、前期工作创建工作空间 二、创建工作包 创建完成后&#xff0c;文件夹的格式为&#xff1a; 三、准备编译文件和代码 3.1 更换编译文件中的内容 将上图中的&#xff0c;CMakeLists.txt文件中的内容&#xff0c;替换为下面的内容 cmake_minimum_required(VERSION 3.0.2) p…