【Linux】gcc和g++

news2024/12/23 13:45:09

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++Linux还有算法
✈️专栏:Linux
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵,希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


目录

  • 前言
  • 一、 Linux下编译C/C++代码
  • 二、gcc/g++是如何完成代码编译
      • 2.1 预处理
      • 2.2 编译
      • 2.3 汇编
      • 2.4 链接
  • 三、库
      • 3.1 函数库的概念
      • 3.2 动态库
      • 3.3 静态库
      • 3.4 小结

前言

大家的云服务器可能没有gcc或者g++指令,如果没有可以分别执行以下指令

  • sudo yum install -y gcc - gcc指令安装

  • sudo yum install -y gcc-c++ g++指令安装

注意:如果sudo指令有问题的,建议先看看这篇博客 -> 点击跳转

一、 Linux下编译C/C++代码

gcc [.c文件]

执行完gcc [.c文件] 后,默认会生成可执行文件 a.out (前提是代码没有语法错误)

在这里插入图片描述

当然也有人想要为这个可执行文件起个名字,那么就要通过 -o选项 来实现

gcc [.c文件] -o [新名字]

在这里插入图片描述

注意:g++ 也可以通过 -o 选项生成指定文件。其指令基本都是一样的

在这里插入图片描述

二、gcc/g++是如何完成代码编译

由于gccg++只有编译文件类型不同,其他大差不差,因此以下就以gcc为例

2.1 预处理

预处理会进行以下操作:

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

我们可以直接通过gcc中的-E选项,来查看预处理的现象。注意:预处理后的文件后缀为.i,此时仍然是C语言代码。目的是生成一个干净的C代码程序

gcc -E [.c文件] -o [.i文件]	

在这里插入图片描述

接下来我们可以打开预处理阶段的文件test.i来看看里面的代码

在这里插入图片描述

大家有没有想过这样一个问题:头文件展开就是将头文件的内容给拷贝过来,那我们怎么知道头文件在哪

  • 其实标准C库头文件(如stdio.hstdlib.h等)通常位于 /usr/include 目录下。

在这里插入图片描述

  • 当然了,标准C++库头文件(如iostreamvector等)通常位于/usr/include/c++目录下,该目录下还会有不同版本的子目录,对应不同的C++标准和编译器版本。

在这里插入图片描述

2.2 编译

  • 编译阶段会进行:语法分析、词法分析、语义分析、符号汇总等,然后将合法的代码转为汇编代码。

编译阶段比较重要的一步就是符号汇总,它会各种符号汇总起来,形成符号表符号表用于各种函数间的相互调用

我们可以直接通过gcc中的-S选项,来查看编译阶段的现象。注意:编译阶段的文件后缀为.s,此时 .s文件里是源文件的汇编代码。

gcc -S [.c文件] -o [重命名为.s文件]
// 注意[.c文件]也可以替换成[.i]文件

在这里插入图片描述

接下来,我们可以打开test.s查看汇编

在这里插入图片描述

2.3 汇编

  • 主要任务是将汇编代码转为二进制(转为计算机懂的语言),并生成符号表

【补充】 什么是符号表

这个东西相当于函数独一无二的地址
C语言的符号是 _函数名
C++更详细一些,通常为 _Z函数名长度+函数名+ 形参类型的首字母

我们可以直接通过gcc中的-o选项,来查看汇编阶段的现象。注意:汇编文件后缀为.o,此时 .o文件将源文件转化为二进制文件。

gcc -c [.c文件] -o [重命名为.o文件]

// 或者可以从[.s文件]开始编译
gcc -c [.s文件] -o [重命名为.o文件]

在这里插入图片描述

我们可以打开test.o来【欣赏】二进制文件

在这里插入图片描述

我们发现是一堆乱码,这是一个正常的现象,因为test.o本身是二进制文件,其,而vim是文本编辑器,自然而然就看不懂

但是我们可以使用工具 readelf:是一个用于查看和分析二进制可执行文件格式elf的工具。

readelf -a [二进制文件]

【以下只截取了一部分】

在这里插入图片描述

注意:二进制文件不可执行,需要通过链接才能执行。

在这里插入图片描述

2.4 链接

  • 将可重定位目标的二进制文件(或称目标文件.o),和库进行链接形成可执行文件。
// 两种写法
gcc [.c文件] -o [重命名可执行文件]	
gcc [.o文件] -o [重命名可执行文件]	

在这里插入图片描述
在这里插入图片描述

上面说了,目标文件需要和库进行链接,因此接下来我们来谈谈库。

三、库

3.1 函数库的概念

C程序中,并没有定义printf函数(我们只是调用函数),且在预编译中包含的stdio.h中也只有该函数的声明,而没有定义函数的实现。那么,是在哪里实现printf函数的呢?

Linux系统中,它把C语言函数实现都被放到名为libc.so的库文件中去了(路径:/usr/lib64/libc.so)。

在这里插入图片描述

没有特别指定时,gcc会到系统默认的搜索路径/usr/lib下进行查找,也就是链接到libc.so库函数中去。

如上图所示,Linux中,C语言函数库是一个文件,以.so为后缀的称为动态库;以.a为后缀的称为静态库

另外,库是有自己的命名规则的。以lib为前缀,name为中缀,.so.版本为后缀。而库真正的名字只有中缀那一块,这也就为什么libc.so称为C语言函数库的原因了。

注意:我们现在的机器上,默认只会安装动态库,静态库是默认没有安装的

在这里插入图片描述

【总结】

  • 函数的实现就是在库当中的

  • 库其实就是把源文件(.c文件),经过一定的翻译,然后打包,只给你提供一个文件(库文件)即可,不用给你提供给太多的源文件,也可以达到隐藏源文件的目的

  • 头文件提供方法的声明, 库文件提供方法的实现 + 我们自己的代码 == 可执行程序

  • 因此。库的作用:不用做很多重复的工作

3.2 动态库

动态库即通过动态链接的库,动态库又称共享库,因为动态库中的内容是被所有程序共享的,简言之动态库中的代码只需要存在一份,程序需要使用时,直接通过对应位置调用就行了

Linux中默认使用 动态链接 的方式,我们可以通过 指令ldd来查看文件的链接情况

在这里插入图片描述
我们还可以通过 file命令查看文件详细信息

在这里插入图片描述

3.3 静态库

静态库采用静态链接的方式;静态链接不同与动态链接共享的方式,如果程序调用静态库 ,会将自己所需要的代码拷贝至程序中 ,完成拷贝后,后续不需要再调用静态库。

如果想采用静态链接链接的方式编译程序,需要在编译时加上-static选项

gcc [源文件] -o [自己取] -static	

而我们开头说了,我们的云服务器默认是没有静态库的,没有的可以通过sudo yum install -y glibc-static下载。还有我们也可以装一下c++的静态库sudo yum install -y libstdc++-static

在这里插入图片描述

当然,我们也可以通过lddfile指令查看链接情况

在这里插入图片描述

由于静态链接是直接将需要的代码拷贝到程序中,因此最终生成的文件会变大,比较占空间

在这里插入图片描述

3.4 小结

【动态库】

  • 优点

    • 动态库因为是共享库,有效的节省资源(节省磁盘空间,内存空间,网络空间等)
  • 缺点

    • 动态库一旦缺失,导致各个程序都无法运行

静态库

  • 优点
    • 程序运行无需依赖库,可以独立运行
  • 缺点
    • 体积大,比较消耗资源,浪费空间

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

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

相关文章

Java日志技术

什么是日志 日志技术 概述 日志技术的体系、Logback日志框架的概述 Logback快速入门 Logback设置日志级别

Python教程75:Pandas中DataFrame数据的修改操作

1.DataFrame数据结构的特点包括: 表格型的数据结构,具有行和列。 每一列的标签值允许使用不同的数据类型。 每个数据值都可以被修改。 结构的行数、列数允许增加或者删除。 有两个方向的标签轴,分别是行标签和列标签。 可以对行和列执行算术运…

基于springboot实现高校食堂移动预约点餐系统【项目源码】计算机毕业设计

基于springboot实现高校食堂移动预约点餐系统演示 Java语言简介 Java是由SUN公司推出,该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称,也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备…

springboot2.0 集成swagger3+Knife4j导出离线API 配置

springboot 版本2.3.1 一、集成swagger3 引入swagger依赖包 <!--swagger3集成--><dependency><groupId>org.springframework.plugin</groupId><artifactId>spring-plugin-core</artifactId><version>2.0.0.RELEASE</version>…

最新yolov8环境搭建、推理训练一站式超详细教学

1、获取yolov8源码 访问yolov8_github官网&#xff0c;网络不稳定时可能需要加速器。yolov8源码地址 获取方式&#xff1a;直接下载或者git工具克隆 我使用git操作进行演示&#xff0c;复制github上的地址(需提前关闭加速器)。 git clone https://github.com/ultralytics/ul…

arduino的API函数

API在这里&#xff1a;Arduino Reference - Arduino Reference 我觉得一天是不可能学的完的&#xff0c;这么多呢 我现在觉得&#xff1a;不用去学习这些API&#xff0c;以后碰到再去看好了

Java基于协同过滤算法开发的springboot+vue服装商城

演示视频 https://www.bilibili.com/video/BV1oH4y127fq/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 主要功能&#xff1a;用户可以浏览商品和特价商品&#xff0c;加入购物车&#xff0c;直接下单支付&#xff0c;在我的个人中心里可以管理自己的…

鸿蒙 ark ui 网络请求 我不允许你不会

前言&#xff1a; 最近有在学习这个鸿蒙的ark ui开发 因为鸿蒙不是发布了一个鸿蒙next的测试版本 明年会启动纯血鸿蒙应用 所以我就想提前给大家写一些博客文章 效果图 11-24 16:26:22.005 25156-25156/com.example.httpsrequest E A0ff00/HTTPS: 请求状态 --> 200, %{pub…

C语言猜素数(ZZULIOJ1292:猜素数)

题目描述 Lx给Xp出了一道难题&#xff0c;随便在0和1000000之间抽出两个数&#xff0c;估计在这两个数之间的素数的个数&#xff0c;如果猜测的结果和正确结果一样&#xff0c;Xp就可以得到Lx的一件礼物&#xff0c;你能猜对吗&#xff1f;编程实现一下吧&#xff01; 输入&…

探索 Vue 中的 bus.$emit:实现组件通信的强大工具

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

ref详解(C#)

本质上来说 ref 的就是把 C/C 指针的那一套又拿回来了&#xff0c;而且还封装成一套自己的玩法。 我想设计者的初心把 ref 的功能限制得死死的&#xff0c;可能也考虑到 C# 是一门面向业务开发的语言&#xff0c;讲究的是做项目快狠准&#xff0c;性能反而不是第一要素&#x…

AIGC原理:扩散模型diffusion综述一:面向视觉计算的扩散模型研究进展

论文地址&#xff1a;State of the Art on Diffusion Models for Visual Computing &#x1f449; 贴一幅SGM&#xff08;Score-based Generative Model&#xff09;的原因是宋飏博士将他2019年提出的SMLD模型和2020年Jonathan Ho提出的DDPM采用SDE进行一统这两大极为相似的生成…

免费不限字数的文本转语音AI配音工具,无需安装

上周给大家分享了AI绘本故事制作&#xff0c;很多小伙伴让我&#xff0c;推荐一款免费的AI配音&#xff0c;音色质量富有情感语调&#xff0c;而且手机上就能用的文本转语音工具。 OK&#xff0c;那么今天就给小伙伴们推荐一款我经常自用的AI配音工具&#xff0c;无需安装下载&…

【教学类-06-10】20231125(55格版)X-Y之间“乘法×题”(以1-9乘法口诀表为例)(随机抽取和正序抽取)

图片展示 &#xff08;随机打乱排序&#xff09; 正序&#xff08;每张都一样&#xff09; 背景需求&#xff1a; 2023年11月24日&#xff0c;准备了一些题目&#xff0c;分别给大4班孩子介绍“5以内加法、5以内减法、5以内加减混合”““10以内加法、10以内减法、10以内加减…

【数据结构】什么是队列?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;队列的定义 &#x1f4cc;队列的抽象数据类型 &#x1f4cc;队列的顺序存储结构 &#x1f4cc;队列的链式存储结构 结语 人生,是一个又一个小小的队列…

【数据结构】树与二叉树(廿六):树删除指定结点及其子树(算法DS)

文章目录 5.3.1 树的存储结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法1. 获取大儿子、大兄弟结点2. 搜索给定结点的父亲3. 搜索指定数据域的结点4. 删除结点及其左右子树a. 逻辑删除与物理删除b. 算法DSTc. 算法解析d. 代码实现递归释放树算法DS e. 算法测试 5. 代码整合…

Multi-Modal Meta Continual Learning

⊙ \odot ⊙denotes the modulation operator&#xff0c;Cont. is the continuum data 辅助信息 作者未提供代码

3.前端--HTML标签2【2023.11.25】

1.HTML常用标签(文本图像链接&#xff09; 文本标签 标题 <h1> - <h6> 段落<p> 我是一个段落标签 </p> 换行 <br /> <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta ht…

数据结构与算法(三)贪心算法(Java)

目录 一、简介1.1 定义1.2 基本步骤1.3 优缺点 二、经典示例2.1 选择排序2.2 背包问题 三、经典反例&#xff1a;找零钱3.1 题目3.2 解答3.3 记忆化搜索实现3.4 动态规划实现 一、简介 1.1 定义 贪心算法&#xff08;Greedy Algorithm&#xff09;&#xff0c;又名贪婪法&…

模拟退火算法应用——求解二元函数的最小值(极小值)

仅作自己学习使用 一、问题 二、代码 clear clcT1 cputime; xmax 5; xmin -5; ymax 5; ymin -5; L 20; % 马尔科夫链长度 dt 0.998; % 降温系数 S 0.02; % 步长因子 T 200; % 初始温度 TZ 1e-8; % 容差 Tmin 0.01;% 最低温度 P 0; % Metropolis接受…