【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 小结

【动态库】

  • 优点

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

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

静态库

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

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

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

相关文章

git-4

1.在GitHub上创建个人仓库 现在仓库中有LICENSE文件,但本地没有这个文件,该怎么办呢?往下看 2.把本地仓库同步到GitHub 3.不同人修改了不同文件如何处理? 两个人在同一个分支上,两个人修改了不同文件 其中一人&…

Python 哈希表的实现——字典

哈喽大家好,我是咸鱼 接触过 Python 的小伙伴应该对【字典】这一数据类型都了解吧 虽然 Python 没有显式名称为“哈希表”的内置数据结构,但是字典是哈希表实现的数据结构 在 Python 中,字典的键(key)被哈希&#x…

出于隐私和安全的考虑,有时需要从谷歌删除你的个人数据,有两种方法

如果你是公众人物、企业或拥有个人品牌的人,那么拥有在线形象很重要。然而,你可能会发现,通过谷歌搜索,陌生人可以获得你的个人信息,如联系方式、地址和财务信息,这会让你感到不安。 幸运的是,…

系统频繁崩溃,如何考虑系统的稳定性和可扩展性?

最近网传互联网应用信息系统频繁崩溃,语雀崩完淘宝崩,淘宝崩完滴滴崩,随着业务的发展和技术的进步,对于信息系统的要求也越来越高。信息应用系统为了满足不断增长的用户和业务需求,提高系统的稳定性和扩展性至关重要。…

短 URL 生成器设计:百亿短 URL 怎样做到无冲突?

Java全能学习面试指南:https://javaxiaobear.cn 我们先来看看,当高并发遇到海量数据处理时的架构。在社交媒体上,人们经常需要分享一些 URL,但是有些 URL 可能会很长,比如: https://time.geekbang.org/hyb…

pytest分布式执行(pytest-xdist)

前言 平常我们手工测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟。如果一个测试人员执行需要1000分钟才能执行完,当项目非常紧急的时候,我们会用测试人力成本换取时间成本,这个时候多找个小伙伴把任务…

MySQL根据binlog恢复数据

简介 本文介绍了使用mysqlbinlog导出数据,根据binlog恢复数据,和导出数据时报需要super权限的解决方法。 环境 MySQL: 5.7.40 说明 MySQL的binlog是数据库服务器在运行过程中产生的日志文件,记录了数据库增删改的操作,可用于恢复和…

重排链表,剑指offerII 26,力扣 120

目录 力扣题目地址: 题目: 那我们直接看题解吧: 解题方法: 难度分析: 审题目事例提示: 解题分析: 解题思路: 解题补充: 力扣题目地址: 143. 重排链表 - 力扣&…

基于Django+Tensorflow卷积神经网络鸟类识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介系统概述系统功能核心技术系统架构系统优势 二、功能三、系统四. 总结  总结 一项目简介 介绍一个基于DjangoTensorflow卷积神经网络鸟类识别系统是一个非…

多目标水母搜索算法(MOJS)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、多目标水母搜索算法MOJS 多目标水母搜索算法(Multi-Objective Jellyfish Search algorithm,MOJS)由Jui-Sheng Chou等…

Verilog 入门(一)(Verilog 简介)

文章目录 什么是 Verilog HDL?Verilog 主要能力模块时延数据流描述方式 什么是 Verilog HDL? Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和…

景联文科技加入中国人工智能产业联盟(AIIA)数据委员会

近日,景联文科技加入中国人工智能产业联盟(AIIA)数据委员会,成为委员会成员单位。 中国人工智能产业发展联盟(简称AIIA)是在国家发改委、科技部、工信部、网信办指导下,由中国信息通信研究院等单…

基于springboot家具商城系统

基于springboot家具商城系统 摘要 这个Spring Boot家具商城系统旨在通过现代化的Web应用程序技术提供一个全功能的电子商务平台。系统的核心实体是家具商品,通过RESTful API控制器提供对商品的增删改查等操作。这个系统使用了Spring Boot框架,借助其简便…

Mac单独修改应用语言

方法1: 方法2: defaults write com.microsoft.Excel AppleLanguages ("zh-cn") defaults write com.microsoft.Word AppleLanguages ("zh-cn")参考:https://www.zhihu.com/question/24976020

红队攻防实战系列一之Cobalt Strike

他日若遂凌云志,敢笑黄巢不丈夫 本文首发于先知社区,原创作者即是本人 前言 在红队攻防中,需要我们拥有综合能力,不仅仅是web渗透的漏洞挖掘与利用,边界突破的方式有很多种,当然这需要我们拥有很强的意识…

【LeetCode】101. 对称二叉树

101. 对称二叉树 难度:简单 题目 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出&#…

图书管理系统源码,图书管理系统开发,图书借阅系统源码配置和运行图解源码已附加

目录 配置简介和软件条件 数据库附件配置 vs应用程序web.config配置数据库链接字符串 数据库文件脚本代码 配置简介和软件条件 所需要的软件是Vs2017以上数据库是Sqlserver2012以上,如果数据库附件不了可以使用数据库脚本附件数据库脚本会在文章末尾写出来。可以…

ArkTS-页面转场动画

页面转场动画 在全局pageTransition方法内配置页面入场和页面退场时的自定义转场动效 两个页面间发生跳转,一个页面消失,另一个页面出现,这时可以配置各自页面的页面转场参数实现自定义的页面转场效果。页面转场效果写在pageTransition函数中…

【Python】获取ip

要使用Python获取IP地址,可以使用socket库中的gethostname()函数和gethostbyname()函数。 import socketdef get_ip_address():hostname socket.gethostname()ip_address socket.gethostbyname(hostname)return ip_addressip get_ip_address() print("IP地…

【BUG合集】(一)①数据库存1/0,请求结果返回true和false;②sql查数据库能查,但mybatis查为空;③data64图片存储为异常;

前言 最近,在工作上接手的任务中,各种 bug 问题出现,在解决的同时也可以记录一下。因此,觉得可以出个记录 bug 合集。方便后来者碰到类似情况,可以作为一个参考进行解决。 文章题目就包含当前文章内容中所遇到的三个 b…