【Linux】gcc和g++

在这里插入图片描述

👦个人主页: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 小结

【动态库】

  • 优点

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

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

静态库

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux shell操作 - 05 进程 与 IO 模型

文章目录 计算机内存分配进程与子进程流IO模型非阻塞IOIO多路复用网络IO模型简单的socket并发的socket 计算机内存分配 一个32位,4G内存的计算机,内存使用分为两部分: 操作系统内核空间;应用程序的用户空间使用的操作系统不同&a…

如何使用低代码平台加速应用开发?

目录 一、背景 二、低代码开发和传统开发的区别 1.低代码开发方式能够实现业务应用的快速交付 2.低代码开发平台还能够降低业务应用的开发成本 三、低代码开发对你有什么帮助? 四、低代码工具的使用者是谁? 五、典型的低代码开发平台有哪些&#xff1f…

02-鸿蒙学习之4.0todoList练习

02-鸿蒙学习之4.0todoList练习 代码 /*** 1:组件必须使用Component装饰* 2.Entry 装饰哪个组件,哪个组件就呈现在页面上* 3.被Entry 装饰的入口组件。build()必须有且仅有一个根 ** 容器 ** 组件* 其他的自定义组件,build() 中…

一篇总结 Linux 系统启动的几个汇编指令

学习 Linux 系统启动流程,必须熟悉几个汇编指令,总结给大家。 这里不是最全的,只列出一些最常用的汇编指令。 一.数据处理指令 1.数据传送指令 【MOV指令】 把一个寄存器的值(立即数)赋给另一个寄存器,或者将一个…

spring boot 整合 spring security

项目结构 添加依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEASE</version><relativePath/></parent><dependency><grou…

leetcode刷题详解十

188. 买卖股票的最佳时机 IV&#xff08;最多买卖k次&#xff09; 注意事项 这道题和最多买卖两次是一模一样的思路就是把2换成k了但是还是有几个地方需要注意的 给的整数数组可能为0k其实没有很大&#xff0c;可以想一下&#xff0c;最多为n/2(n是数组的长度) int maxProfit…

大型网站系统架构演化(Web)

大型网站系统架构演化 大型网站系统架构演化需要关注的维度涉及的技术演进过程单体架构垂直架构使用缓存改善网站性能缓存与数据库的数据一致性问题缓存技术对比Redis分布式存储方案Redis集群切片的常见方式Redis数据类型Redis 淘汰算法 大型网站系统架构演化 需要关注的维度 …

2024年最受欢迎的项目管理工具盘点

十大项目管理系统包括&#xff1a;1.产品研发项目管理工具&#xff1a;PingCode&#xff1b;2.通用项目协作工具&#xff1a;Worktile&#xff1b;3.开源项目管理系统&#xff1a;Redmine&#xff1b;4.IT/敏捷项目管理系统&#xff1a;Jira&#xff1b;5.免费个人项目管理&…

NX二次开发UF_CURVE_create_arc_point_point_radius 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc_point_point_radius Defined in: uf_curve.h int UF_CURVE_create_arc_point_point_radius(tag_t point1, tag_t point2, double radius, UF_CURVE_limit_p_t l…

问答社区运营的核心是什么?

问答社区是用户在平台上获得信息的一种方式&#xff0c;一般问答社区适用于医疗行业&#xff0c;法律行业等专业领域的行业&#xff0c;可以划分为知识型分享社区的一种&#xff0c;用户提供提问&#xff0c;邀请回答&#xff0c;选择最佳回复&#xff0c;设置问题围观&#xf…

字符串逆序问题

写一个函数&#xff0c;可以将任意输入的字符串逆序&#xff08;要可以满足多组输入&#xff09; 这个题有三个点 1.要读入键盘输入的字符串&#xff0c;所以要用到字符串输入函数 2.可以进行多组输入 3.把输入的n组字符串都逆序 #define _CRT_SECURE_NO_WARNINGS 1 #incl…

Portraiture2024最新Photoshop磨皮插件更新啦

Portraiture是一款由Imagenomic公司研发的Photoshop磨皮插件。该插件以其优秀的磨皮效果&#xff0c;成为了众多摄影师和化妆师使用的首选插件。Portraiture主要用于影楼、婚纱、时尚摄影等各个领域。其主要特点是能够轻松地模拟人眼的视觉感受&#xff0c;自然地修饰人像照片。…

【Linux专题】http(s)代理

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等_厦门微思网络的博客-CSDN博客文章浏览阅读444次。风和日丽&#xff0c;小微给你送福利~如果你是小微的老粉&#xff0c;这里有一份粉丝福利待领取...如果你是新粉关注到了小微&am…

元宇宙的八个关键技术介绍!

人工智能&#xff08;AI&#xff09;、物联网、增强现实、虚拟现实、区块链、NFT、3D建模、空间和边缘计算等技术使最元宇宙开发成为可能。本文对元宇宙的8个关键技术进行了介绍。 人工智能 人工智能技术中的目标分割、目标追踪、姿态估计等是元宇宙场景中感知现实的关键工具&…

【笔记】小白学习电路维修

学习视频&#xff08;b站&#xff09;&#xff1a;从0开始学电路 从0开始学电路维修 p1 黄色长方体元件P2 故障率最高的元件p3带芯铜丝线圈是什么区分电感和变压器接入电路分析&#xff1a; p4 交流和直流分界线整流桥接线整流桥故障判断 带色环的不一定是电阻 p1 黄色长方体元…

51单片机项目(16)——基于51单片机的水箱冷却系统

1.项目背景 汽车水箱又称散热器&#xff0c;是汽车冷却系统中主要机件&#xff1b;其功用是散发热量&#xff0c;冷却水在水套中吸收热量&#xff0c;流到散热器后将热量散去&#xff0c;再回到水套内而循环不断。从而达到散热调温的效果。它还是汽车发动机的重要组成部分。 汽…

解决ssh使用public key远程登录服务器拒绝问题

目录 使用场景windows安装ssh客户端使用powershell ssh登录服务器生成密钥文件ubuntu ssh服务器配置使用vscode远程登录使用Xshell远程登录使用MobaXtem远程登录Server refused our key问题解决方案 使用场景 使用vscode远程ssh登录使用public key不需要输入密码,比较方便. w…

Java 之 lambda 表达式(一)

目录 一. 前言 二. lambda 表达式语法 2.1. 语法1&#xff1a;无参&#xff0c;无返回值 2.2. 语法2&#xff1a;一个参数&#xff0c;无返回值 2.3. 语法3&#xff1a;两个参数&#xff0c;lambda 体中有多条语句 2.4. 语法4&#xff1a;两个以上参数&#xff0c;有返回…

Java 常用容器

目录 列表栈&#xff08;类&#xff09;队列(接口)setMap 列表 package com.czl;import java.util.ArrayList; import java.util.List; //AltEnter导入包 public class Main {public static void main(String[] args) throws Exception{List<Integer> list new ArrayLis…

群晖NAS配置之自有服务器ngrok实现内网穿透

群晖NAS配置之自有服务器ngrok实现内网穿透 前言-内网穿透 内网穿透是指通过一种技术让外部网络可以访问到内网的NAS设备&#xff0c;这样即使在不同网络环境下&#xff0c;也能够远程访问和管理NAS设备。以下是一些常见的内网穿透方案&#xff1a; Synology官方提供的Quick…