【Linux】编译器gcc/g++的使用

news2024/11/13 16:02:22

🏖️作者:@malloc不出对象
⛺专栏:Linux的学习之路
👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈
在这里插入图片描述

目录

    • 前言
    • 一、gcc/g++的介绍
    • 二、程序的翻译环境
      • 2.1 链接
      • 2.2 动静态库
        • 2.2.1 动态库的感性理解
        • 2.2.2 感性理解静态库
        • 2.2.3 Linux默认使用的库
        • 2.2.4 动静态库与动静态链接的理解


前言

本篇文章我们将要来学习的是Linux下的两种编译器,gcc是C语言的编译器,g++是C++的编译器,它们的使用方式基本一致所以接下来我们只需了解其中一种编译器的使用指令即可;同时本文还将重点谈谈链接过程,动静态库的概念。

一、gcc/g++的介绍

gcc(GNU C Compiler)是 GNU 退出的功能强大、性能优越的多平台编译器,其可以编译利用 C语言、C++ 和 Object C 等语言编写的程序。gcc 编译出的目标代码质量非常好,编译速度也很快,并且 gcc 是一个交叉平台编译器,它能够在当前处理器平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合嵌入式领域的开发编译。

二、程序的翻译环境

我们通常把一个或多个源文件(.c)形成一个(.exe)可执行程序叫做翻译环境,它又分为预处理、编译、汇编和链接这四个步骤,关于这些步骤的详细细节大家可以看我之前写的这篇博客,下面我们再来详谈一下链接过程。

2.1 链接

所谓链接过程到底是在干什么? 链接过程其实就是在链接库–>动静态库。想想为什么我们能直接使用printf函数?printf函数是我们自己实现的吗?不是,它是库提供给我们的。那为什么库要提供给我们呢?很简单,为了提高开发效率,如果我们连输入输出函数都要我们用户来实现,你想想这个我们开发的门槛是不是比较高?所以为了提高开发效率,我们将一些函数封装在库中(库函数),在链接过程我们使用了对应的目标函数就从库中加载对应的函数代码和数据。

接下来我们就来初步认识一下动静态库。

2.2 动静态库

我们为什么能在Linux下进行C、C++代码的编写和编译呢? 这是因为Linux系统默认已经携带了语言级别的头文件和语言对应的库!!

如何查看我们的链接过程?

ldd 可执行文件

在这里插入图片描述

/lib64/libc.so.6是libc-2.17.so的一个软链接,/lib64/libc.so.6文件里放的是libc-2.17.so文件的路径信息,读取文件/lib64/libc.so.6时,系统会自动将访问者导向文件libc-2.17.so,你也就可以认为libc-2.17.so就是我们现在使用的C语言库!

库分为两种一种是静态库,在Linux下通常以.a为后缀,另一种是动态库,通常以.so为后缀;而Windows中静态库后缀为.lib,动态库后缀为.dll。虽然名称上有所不同,但是它们之间本质上的功能也是大致差不多的。

2.2.1 动态库的感性理解

在这里插入图片描述

下面我用文字来描述一下上图表示的情景:小库同学在只因中学读书,他还没来学校的时候就向学长们打听了学校附近的网吧,学长告诉他出了北门往前走100m就有一个只因网咖,那里的电脑配置也非常好,于是小库就记下了只因网咖的地址,心里想着以后有时间就去放松放松。小库也不是一个贪玩的人,他每天都有一个学习计划清单,这天他在吃完饭之后就打算去网咖放松放松,于是他在脑海里回想起了之前学长告知他的地址,它通过地址找到了网咖并且在里面舒服的找了一个包厢在网吧里面欢快的上着网,开心完之后他又回到宿舍完成接下来的学习任务。

我们来感性理解一下这个过程:学长告诉了你网咖的地址,这就相当于你知道了某个函数的地址,你记住了这个函数的地址相当于你将这个函数加入了符号表,你通过地址找到了这个网咖这就代表着链接成功。那么小库为什么要去网咖呢?因为小库自己的电脑配置不行,而网咖里面的电脑配置好网速快体验好,这就相当于去调用库函数,网咖就对应着动态库,它的里面有很多台电脑对应不同的库函数,在上完网回到宿舍这个过程对应着库函数调用完成回到主函数,回到主函数之后继续执行下面的操作。网咖里面可以让任何人都能上网,网咖它也就是一个共享库。假如有一天只因网咖倒闭了,那么很多人都不能去上网了,这也就对应着我们的动态库没了的话,那么我们的库函数都不能被使用了!!不能被使用就意味着整个学习任务无法完成,程序编译错误了。

2.2.2 感性理解静态库

在这里插入图片描述

我们来感性理解一下这个过程:之前你跟你的老爸谈过一个条件,你如果期末考试考了年级前10,你的老爸就答应帮你买一台电脑。小库其实也是个学霸,果不其然小库这次靠近了年级前10,他的老爸就打算给它买一台电脑,你也如愿以偿的有了自己的电脑,那么如果有一天只因网咖倒闭了那么你还能上网吗?当然能,因为此时你已经有了电脑,它倒闭了于你来说关系不大了。你的老爸给你买电脑的过程就对应着拷贝一份你所需的代码到你的程序当中,所以就算它倒闭了,你也能正常使用电脑。

2.2.3 Linux默认使用的库

Linux默认使用的是动态库还是静态库?

在这里插入图片描述

另外我们之前讲过,Linux下的大部分指令都是由C语言写的,下面我们来看看这些指令使用的是什么库。

在这里插入图片描述

我们可以看到这些指令都是使用的动态库,这也就证明了Linux下默认使用的就是动态库,动态链接!!

Linux下默认使用的是动态库。在Linux系统中,大部分系统库和第三方库都是以动态库的形式提供的,这些库的文件一般以“.so”为后缀,被称为共享库或动态链接库。当程序需要调用库函数时,动态链接器会在系统的默认库路径中搜索相关的动态库文件,将其加载到内存中,并在程序运行时解析链接。虽然Linux系统中也提供了静态库(以“.a”为后缀)的支持,但是在默认情况下,编译器和链接器都会使用动态库。如果需要使用静态库,需要显式指定使用静态链接方式进行编译和链接,一般使用命令行选项“-static”来实现。

如何使用静态库呢? 编译链接的时候带上-static选项。

在这里插入图片描述

我们可以看到静态链接的文件大小比动态链接的文件大上将近100倍,这还仅仅是在调用printf函数的基础上,如果我们还使用了其他的库函数那么这个文件将会非常之大!!!

在静态链接的情况下,编译器会将所需的库函数的机器码复制到可执行文件的文本段中,这样可执行文件就包含了所有需要的代码,可以在没有其他依赖项的情况下运行。因此,如果你的程序使用了printf函数,那么整个C标准库的代码都会被链接到最终的可执行文件中。这会使得可执行文件变得比较大,但也会确保程序在其他环境中运行时能够正确地执行。

注:Linux 指令也是用 C语言写的可执行程序,这些指令也是动态链接 C 标准库生成的。如果我们删掉了 C 动态库,那么很多 Linux 指令都会无法使用了。C语言的动态库只有一份,不会出现重复的库代码。因此,动态库也称为共享库。以后我们要是下载一个 C语言写的程序,不需要卸载 C语言的标准库。

2.2.4 动静态库与动静态链接的理解

动静态库的认识:

  • 库分为动静态库(专门让编译器对用户程序进行静态链接的)和动态库(专门让编译器对用户程序进行动态链接的)
  • 静态库和静态链接:链接的时候,如果是静态的,拷贝静态库中我所需要的代码到我自己的可执行程序中
  • 动态库和动态链接:链接的时候,如果是动态的,拷贝动态库中我所需要的代码的地址到我自己的可执行程序中相关的位置
  • 静态链接成功:我们的程序不依赖任何库,自己就可以独立运行
  • 动态链接成功:我们的程序还是依赖动态库,一旦动态库缺失,我们的程序就无法运行
  • 静态库:因为自身拷贝的问题比较浪费空间
  • 动态库:因为可以做到被大家共享,所以真正的实现永远都是在库中,程序内部只有地址,比较节省空间。
  • 静态库和动态库:Linux默认使用的是动态链接和动态库。

静态链接(static linking)和动态链接(dynamic linking)是编译器和操作系统中常见的两种库链接方式。

静态链接:

静态链接是指在编译时将所有需要用到的库函数的机器码拷贝到可执行文件中,使得可执行文件本身包含了所有的代码和数据,因此在运行时不需要依赖外部库。这种链接方式的优点是运行时速度快、依赖性低,但缺点是可执行文件比较大,并且如果库函数更新,需要重新编译链接可执行文件才能使用新版本的库函数。

动态链接:

动态链接是指在运行时才将需要用到的库函数的机器码加载到内存中,使得多个程序可以共享同一份库函数的代码和数据。这种链接方式的优点是可执行文件比较小,且多个程序可以共享同一份库函数,减少了内存占用,同时库函数更新时只需要更新库文件,不需要重新编译链接可执行文件。缺点是运行时速度较慢,并且可能存在依赖性问题,即如果某个库函数更新或者丢失,就会导致程序无法运行或者运行出错。

在实际应用中,一般会根据实际需求选择静态链接或者动态链接。如果需要程序独立运行或者需要最大的运行速度,就选择静态链接;如果需要节约内存或者需要多个程序共享同一份库函数,就选择动态链接。


本篇文章的内容就讲到这里了,如果有任何疑问或错处欢迎大家评论区相互交流orz~🙈🙈

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

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

相关文章

基于Vue CLI搭建vue3项目

前言 使用vue官方的脚手架进行搭建Vue CLI 注意:create-vue是基于Vite搭建项目,今天我们还是基于webpack搭建使用vue create 项目名称这个命令 一、步骤 1、 使用默认配置项还是自定义配置 这里我选择自定义 2、 选择需要配置的选项 根据个人进行…

ChatGPT不会很快接管人类工作,AI也不会免费打工

ChatGPT 等大模型的相继发布,让很多人倍感压力,害怕 AI 会很快接管他们的工作。对此,OpenAI 也曾发表过一项研究,表明 ChatGPT 的影响涵盖所有收入阶层,且高收入工作可能面临更大的风险。事实到底如何呢? …

IT知识百科:什么是下一代防火墙和IPS?

引言 随着网络攻击的日益增多,防火墙和入侵防御系统(Intrusion Prevention System, IPS)已成为企业网络安全的必备设备。然而,传统的防火墙和IPS已经无法满足复杂多变的网络安全威胁,因此,下一代防火墙和I…

Java集合(底层设计与实现)

Java集合(底层设计与实现) 集合体系 List接口 基本介绍 元素有序(即添加顺序和取出顺序一致)、且可重复支持索引有下标,下标对应元素在容器中的位置 ArrayList 基本介绍:底层由数组实现;在…

软考 软件设计师数据结构二笔记

查找基本概念 顺序查找 折半查找(二分查找顺序存储 ) 查找一个数据先给他折中,看看要查找的是不是大于中间值如果大于前面的就不用查找了 l和r指向对应下标 二分查找补充 上图描述如何构造这般查找判定树,一般都是下取整 …

PDF怎么转Word?简单几步轻松操作

PDF格式是目前最为流行的电子文档格式之一。但是,当我们需要编辑或修改PDF文件时,通常需要将其转换为Word文档格式。在本文中,我们将介绍如何将PDF文件转换为Word文档,并且列举PDF和Word文档操作上的差异。 PDF转Word文档操作方法…

19 树表的查找

文章目录 二叉排序树(BST)查找操作二叉排序树的存储结构查找实现查找算法分析二叉排序树的平均查找长度 插入操作删除操作代码实现 平衡二叉树(AVL)插入&旋转操作插入操作四种旋转情况代码实现 删除操作查找操作 介绍 树表查找是一种在树形数据结构中…

非法捕捞识别预警系统 yolov7

非法捕捞识别预警系统通过yolov7网络模型AI视频分析技术,非法捕捞识别预警系统模型算法能够对河道湖泊画面场景中出现的非法捕捞行为进行7*24小时不间断智能检测识别实时告警通知相关人员及时处理。Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测&#xff…

应用网关Nginx+Https证书+内网穿透+图片切割水印+网关登录

一、开源项目简介 Apiumc Gateway 它一个工具等于 Nginx Https证书 内网穿透 图片切割水印 网关登录 Apiumc Gateway 是高性能的Web网关,它从底层Socket原始通信层开始,采用多线程、多任务模式从新构建Web服务,充分发挥当下多核的CPU的…

当代年轻人搞副业有多野?工资6000,兼职1W...

凌晨12:00,我被同做新媒体的闺蜜小冉震了出来。 这是投稿出去,第10086次没有回声。 那种无力感掐着我的脖子,感觉整个人要窒息了。 写稿,真的好难,我好想放弃。 可是,每月被花呗、信用卡、房租支配的恐惧却…

C++【模板进阶】

✨个人主页: 北 海 🎉所属专栏: C修行之路 🎃操作环境: Visual Studio 2019 版本 16.11.17 文章目录 🌇前言🏙️正文1、非类型模板参数1.1、使用方法1.2、类型要求1.3、实际例子:arr…

详解:三子棋以及N子棋的实现

三子棋以及N子棋的实现 初始化棋盘打印棋盘玩家下棋电脑下棋判断输赢主函数的实现(test.c)game.c的实现game.h的实现 铁汁们~今天给大家分享一篇三子棋以及N子棋的实现,来吧,开造⛳️ 实现流程: 1.游戏不退出,继续玩下一把&#x…

ML之FE:基于波士顿房价数据集利用LightGBM算法进行模型预测然后通过3σ原则法(计算残差标准差)寻找测试集中的异常值/异常样本

ML之FE:基于波士顿房价数据集利用LightGBM算法进行模型预测然后通过3σ原则法(计算残差标准差)寻找测试集中的异常值/异常样本 目录 基于波士顿房价数据集利用LiR和LightGBM算法进行模型预测然后通过3σ原则法(计算残差标准差)寻找测试集中的异常值 # 1、定义数据…

软件架构复习笔记(张友生教材版本)

考纲(张友生版本软件架构 考试题型: 10*3单选 5*3简答题 5*3设计图(含画图) 10*2 论述题 10*2综合题 复习以课件为主,书为辅 第一章 (软件危机) ? ? 构造模型与实现 掌握软件结构体系核心模型 第二章 软件体…

K8s之Pod最小调度单元详解

文章目录 一、Pod概念1、Pod是什么?2、Pod网络共享实现方式3、Pod存储共享方式4、创建Pod整体流程 二、使用YAML文件定义Pod资源1、Pod资源清单YAML文件书写技巧1. YAML语法格式:2. 配置Linux tab缩进两个空格3. 使用kubectl explain帮助命令 2、创建Pod…

ChatGPT客服系统产品-利用chatgpt训练企业知识开发个性化客服系统

打造最前沿的AI智能客服系统,基于自有数据语料,充分运用ChatGPT的大模型自然语言生成能力,定制化客服系统为企业提供自主性的客服服务能力。 ChatGPT如何革新智能客服? 根据当前ChatGPT的使用情况,我们发现未来中短期内…

基于 DDR3 的串口传图帧缓存系统设计实现(fifo2mig_axi )

文章目录 前言一、接口转换模块设计二、fifo2mig_axi 模块二、接口转换模块仿真四、fifo2mig_axi_tb五、仿真展示 前言 结合串口接收模块和 tft 显示屏控制模块,设计一个基于 DDR3 的串口传图帧缓存系统。 提示:以下是本篇文章正文内容,下面…

次世代烘焙 法线贴图 相关知识

一般将低模 高模的法线贴图实现大量细节模型画面的游戏称为次时代游戏。 次世代常用软件 低模:Maya、3Dmax、Topogun 。 中模:Maya、3Dmax 。 高模:Maya、3Dmax、Zbrush。 UV:Maya、Zbrush、Unfold3D、Uvlayout 。 烘焙&#x…

【观察】华为重构分销伙伴体系,坚持“长期主义”做大分销市场

毫无疑问,随着数字化转型的加速,当前不同类型、不同规模的企业,在面临数字化转型时呈现出了不同的困境和特征,同时对合作伙伴也提出了更高的要求,因此唯有通过“精耕细作”的方式才能更好地加速企业数字化转型的步伐。…

AdaSparse: 自适应稀疏网络的多场景CTR预估建模

▐ 摘要 CTR(Click-through rate)预估一直是推荐/广告领域重要技术之一。近年来,通过统一模型来服务多个场景的预估建模已被证明是一种有效的手段。当前多场景预估技术面临的挑战主要来自两方面:1)跨场景泛化能力:尤其对稀疏场景&…