当前位置: 首页 > news >正文

【linux基础(六)】Linux中的开发工具(中)--gcc/g++

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:Linux从入门到开通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学更多操作系统知识
  🔝🔝


在这里插入图片描述

Linux中的开发工具

  • 1. 前言
  • 2. gcc/g++的使用介绍
  • 3. 执行可执行程序
  • 4. 程序翻译的四个阶段
    • 4.1 预处理阶段
    • 4.2 编译阶段
    • 4.3 汇编阶段
    • 4.4 链接阶段
  • 5. 库函数的命名和分类(动静态库)
  • 6. 动静态库的区别与优缺点
  • 7.总结以及拓展

1. 前言

如果你不知道vim的各种用法和快捷键
请先阅读上一篇文章: yum和vim详解

现在,我们可以在Linux下编辑代码了
编辑好的文件是一个.c文件,vim不像
VS一样既可以编写代码也可以运行代码
在Linux中运行代码需要使用:gcc,g++

本章重点:

本篇文章会着重讲解gcc/g++的使用
以及程序翻译的几个过程和对应的文件
最后讲解动态库和静态库的区别和联系


2. gcc/g++的使用介绍

首先我们要明确一点:
在之前的Linux学习中谈到
Linux中不分文件后缀,所以文本文件可以
设置后缀为txt来提醒读者这是一个文本文件
也可以什么都不写

但是Linux系统不分文件后缀
不代表Linux下的各种程序不分!

今天要学习的gcc和g++就是Linux下的程序
它们是要看文件后缀的!

  • gcc: C语言编译器,只能编译C语言
  • g++: C++编译器,C/C++都可以编译

gcc/g++使用方法:

  1. 生产的可执行程序名字默认为:a.out
gcc code.c
  1. 自定义可执行程序的名字
gcc code.c -o 自定义名字
  1. 使用C99标准来编译
gcc code.c -std=99

3. 执行可执行程序

执行可执行程序:

当我们编译好程序后,会在当前目录生成一个
可执行程序,此文件通常是绿色的

在这里插入图片描述

此时我们只需要使用以下指令即可运行代码!

./a.out

注:.代表要在当前目录下找可执行文件.必须加上


4. 程序翻译的四个阶段

虽然现在已经掌握了如何编译并运行代码
但是在C/C++代码的翻译过程中还有四个
阶段值得我们去学习:

  1. 预处理阶段
  2. 编译阶段
  3. 汇编阶段
  4. 链接阶段

4.1 预处理阶段

预处理阶段要做的工作有:

  • 头文件展开
  • 去掉注释
  • 条件编译
  • 宏替换

那么预处理阶段过后还是C语言吗?
现在我们用Linux指令来查看一下:

使用指令: gcc -E csdn.c -o csdn.i

指令解释:将程序停留在预处理过程后,生成.i文件

在这里插入图片描述
现在我们使用vim编辑器打开.i件:

预处理阶段

可以发现,我们写的代码在最下面
然而上面还有几百行其实就是头文件展开
所谓头文件展开就是:
将头文件的内容拷贝到当前文件
在头文件中有许多空行,这是
因为原先的头文件有注释,此时注释已经没了

注:其他工作大家可自行去验证


4.2 编译阶段

编译阶段的主要工作是:

  • 将C语言翻译为汇编代码

编译阶段过后,就不是C语言了!
现在我们用Linux指令来查看一下:

使用指令: gcc -S csdn.i -o csdn.s

指令解释:将程序停留在编译过程后,生成.s文件

注:可以由.c文件直接使用以上指令变成.s文件

在这里插入图片描述

使用vim编辑器打开.s文件:

B站视频描述

可以发现,现在的汇编代码
如果没有了解过是很难读懂的


4.3 汇编阶段

汇编阶段的主要工作是:

  • 将汇编代码变成可重定位二进制文件

汇编阶段过后,文件存放的是二进制信息!
现在我们用Linux指令来查看一下:

使用指令: gcc -c csdn.s -o csdn.o

指令解释: 将程序停留在汇编过程后,形成.o文件

注:这里也可以用.c或.i文件形成.o文件

在这里插入图片描述

此时使用vim打开文件是乱码
可以使用指令od查看二进制文件:

B站视频描述


4.4 链接阶段

链接阶段比较复杂,它大致的流程是这样的:

.o文件 + 系统库 = 可执行程序

在本篇文章的后半段讲完动静态库后再解释!


5. 库函数的命名和分类(动静态库)

我们在写C语言代码时使用的printf函数
并没有自己实现,然而在stdio.h头文件中
也只有printf函数的说明,那么此函数的
实现是在哪里实现的呢?

引出今天的新内容
查看一个可执行程序依赖的第三方库

使用指令: ldd 可执行程序名

在这里插入图片描述

可以发现,在路径lib64里有一个文件叫libc.so.6
这个就是刚刚的C语言程序所要依赖的库

对于库名字的解释:

在这里插入图片描述

可见,libc.so.6实际上就是C的标准库!

拓展:Linux和Windows下动静态库命名区别:

  • Linux下: .so 是动态库 .a 是静态库

  • Windows下: .ddl 是动态库 .lib 是静态库

现在我们就可以理解链接过程了
链接过程就是将.o文件和动/静态库结合的过程


6. 动静态库的区别与优缺点

通俗的来讲,动态库类似于网吧的电脑
而静态库类似于自己家里的电脑

它们的区别是:

  • 动态库是共享库,通过函数地址来关联程序
  • 静态库是私有库,可以独立运行

动态库: 是C/C++或其他第三方提供的所有方法的集合,被所有程序以动态链接的方式关联起来

静态库: 是C/C++或其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码拷贝至自己的可执行程序当中!

说白了,静态库是将所有代码拷贝过来
而动态库是去找函数的地址调用此函数

动静态库的优缺点:

  • 动态库: 优点:形成的可执行程序体积较小,节省资源
    缺点:要找函数地址,会稍慢一点,并且有强依赖性

  • 静态库: 优点:无视库,可以独立运行
    缺点: 体积太大,浪费资源

我们在编译代码时,默认使用的是动态库
并且Linux下绝大多数库都是动态库!

如果你想使用静态库编译代码

使用指令: gcc code.c -static


7.总结以及拓展

总的来说gcc,g++这两个编译器并不难
掌握它们就需要学会使用一些特殊的指令
这里列出一些gcc常用的指令
大家可以下来自己尝试:

在这里插入图片描述

拓展: 计算机语言发展史和C/C++的翻译过程

众所周知,计算机只认识二进制码是因为
计算机内的硬件元器件只认识二进制(正电/负电)
最开始和计算机交流是用二进制进行交流
最经典的用具就是二进制打孔胶带

在这里插入图片描述

科学家觉得用二进制交流非常不方便!
于是发明了汇编语言,汇编语言和汇编编译器
都是用二进制码写的,当这一过程被完善后
就可以用汇编语言来重新编写汇编编译器了!

有了汇编语言后陆陆续续又发展了许多语言
最经典的莫过于C语言!然而C语言是用汇编
代码编写的,C语言的编译器也是用汇编代码写的
当这一过程成熟后,就可以用C语言程序编写
C语言的编译器了,于是语言才慢慢发展起来

结论:

通过了解C语言的历史我们发现
C语言的翻译过程正是它的历史过程!
先从C语言翻译为汇编,再从汇编翻译为二进制
因为大佬总是懂得站在巨人的肩上,有前人
编写了从汇编到二进制的代码,那么我们就
不用再写直接从C语言到二进制的代码了

一是方便了科学家本身,二是让我们勿忘历史!


🔎 下期预告:Linux开发工具(下) 🔍

相关文章:

【linux基础(六)】Linux中的开发工具(中)--gcc/g++

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到开通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux中的开发工具 1. 前言2.…...

u盘上面 安装 ubuntu 系统

u盘上面 安装 ubuntu 系统 下载 一个 Ubuntu 22.04.3 LTS 桌面版 https://ubuntu.com/download/desktop 找到一个U盘 参考文章: 把 Ubuntu 装到U盘里随身携带,并同时支持 BIOS 和 UEFI 启动 https://www.luogu.com.cn/blog/GGAutomaton/portable-ubu…...

【推荐】SpringMVC与JSON数据返回及异常处理机制的使用

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《【推荐】Spring与Mybatis集成整合》 ⛺️ 生活的理想,为了不断更新自己 ! 1.JSON 在SpringMVC中,JSON数据返回通常是通过使用ResponseBody注解将Java对象转换为JSO…...

SpringBoot新增拦截器详解

目录 一、拦截器使用 二、SpringMvc拦截器接口 三、SpringBoot集成拦截器 拦截器(Interceptor)通常是指在软件开发中用于处理请求和响应的中间件组件。拦截器的主要目的是在请求进入某个处理流程或在响应返回给客户端之前执行一些额外的操作或逻辑。 …...

Golang开发--select

在Go语言中&#xff0c;select语句用于在多个通道操作中进行选择。select语句使得程序可以同时等待多个通道的操作&#xff0c;并在其中任意一个通道就绪时执行相应的操作。以下是select语句的详细描述&#xff1a; select { case <-ch1:// 当ch1通道可读时执行的操作 case…...

贝塞尔曲线的一些资料收集

一本免费的在线书籍&#xff0c;供你在非常需要了解如何处理贝塞尔相关的事情。 https://pomax.github.io/bezierinfo/zh-CN/index.html An algorithm to find bounding box of closed bezier curves? - Stack Overflow https://stackoverflow.com/questions/2587751/an-algo…...

计算机网络原理 运输层

一&#xff0c;运输层协议概述 1&#xff0c;进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最底层。当网络边缘部分的两台主机使用网络核心部分的功能进行…...

【JavaEE】多线程案例-阻塞队列

1. 前言 阻塞队列&#xff08;BlockingQueue&#xff09;是一个支持两个附加操作的队列。这两个附加的操作是&#xff1a; 在队列为空时&#xff0c;获取元素的线程会等待队列变为非空当队列满时&#xff0c;存储元素的线程会等待队列可用 阻塞队列常用于生产者和消费者的场…...

【物联网】简要介绍最小二乘法—C语言实现

最小二乘法是一种常用的数学方法&#xff0c;用于拟合数据和寻找最佳拟合曲线。它的目标是找到一个函数&#xff0c;使其在数据点上的误差平方和最小化。 文章目录 基本原理最小二乘法的求解应用举例使用C语言实现最小二乘法总结 基本原理 假设我们有一组数据点 ( x 1 , y 1 …...

慢查询SQL如何优化

一.什么是慢SQL? 慢SQL指的是Mysql中执行比较慢的SQL,排查慢SQL最常用的方法是通过慢查询日志来查找慢SQL。Mysql的慢查询日志是Mysql提供的一种日志记录&#xff0c;它用来记录Mysql中响应时间超过long_query_time值的sql,long_query_time的默认时间为10s. 二.查看慢SQL是否…...

UART 通信-使用VIO进行板级验证

串口系列知识分享: (1)串口通信实现-串口发送 (2)串口通信发送多字节数据 (3)串口通信实现-串口接收 (4)UART 通信-使用VIO进行板级验证 (5)串口接收-控制LED闪烁 (6)使用串口发送实现ACX720开发板时钟显示 (7)串口发送+RAM+VGA传图 文章目录 前言一、uart串口协…...

linux 查看可支持的shell

查看可支持的shell linux中支持多种shell类型&#xff0c;所以在shell文件的第一行需要指定所使用的shell #!/bin/bash 指定该脚本使用的是/bin/bash&#xff0c;这样的机制使得我们可以轻松地引用任何的解释器 查看该linux系统支持的shell cat /etc/shells/bin/sh/bin/bash/us…...

微服务简介

微服务简介 微服务架构是一种软件架构模式&#xff0c;它将一个大型应用程序拆分为一组小型、独立的服务&#xff0c;每个服务都有自己的业务逻辑和数据存储。这些服务可以独立开发、部署和扩展&#xff0c;通常使用HTTP或其他轻量级通信协议进行通信。 以下是微服务架构的一…...

PHP自己的框架2.0设置常量并绑定容器(重构篇三)

目录 1、设置常量并绑定容器 2、容器增加设置当前容器的实例和绑定一个类实例当容器 3、将常量绑定到容器中 4、运行效果 1、设置常量并绑定容器 2、容器增加设置当前容器的实例和绑定一个类实例当容器 //设置当前容器的实例public static function setInstance($instance){…...

重建大师提交空三后引擎状态是等待,怎么开启?

答&#xff1a;图片中这是在自由网空三阶段&#xff0c;整个AT都是等待中&#xff0c;可以修改任务目录和监控目录看一下&#xff0c;先设置引擎&#xff0c;再提交空三。...

【数据结构】堆的向上调整和向下调整以及相关方法

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3; 文章目录 一、堆的概念二、堆的性质…...

【蓝桥杯选拔赛真题60】Scratch旋转风车 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch旋转风车 一、题目要求 编程实现 二、案例分析 1、角色分析...

JavaSE、JavaEE与Spring的概念和异同点剖析以及规范13 个分析

JavaSE、JavaEE与Spring的概念和异同点剖析以及规范13 个分析 目录概述需求&#xff1a; 设计思路实现思路分析1.什么是JavaSE2.是JavaEE3.什么是Spring 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&…...

微信小程序的图书馆图书借阅 座位预约系统 读者端设计与实现

该系统基于B/S即所谓浏览器/服务器模式&#xff0c;应用springboot框架&#xff0c;选择MySQL作为后台数据库。系统主要包括系统图书信息、图书借阅、图书归还、自习室信息、自习室预约等功能模块。 关键词 微信小程序的图书馆读者端&#xff1b;微信小程序&#xff1b;java语…...

在阿里云 linux 服务器上查看当前服务器的Nginx配置信息

我们可以通过命令 sudo nginx -t查看到nginx.conf的路径 可以通过 sudo nginx -T查看 nginx 详细配置信息&#xff0c;包括加载的配置文件和配置块的内容 其中也会包括配置文件的内容...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...