【Linux】gcc简介+编译过程

news2024/9/23 16:21:31

gcc是Linux系统下一款专门针对于C语言的代码编译软件。g++则是Linux下针对于CPP语言的代码编译软件,实际上g++底层也大量用了gcc代码。

目录

  • 1.gcc基本认识与安装
  • 2.gcc编译过程
    • 2.1编译 和 链接
    • 2.2编译步骤形成的原因
    • 2.3编译器的自举
    • 2.4链接

1.gcc基本认识与安装

gcc是一款Linux系统下的C语言编译软件。

sudo yum install -y gcc // 下载gcc

当我们下载好gcc之后,可以查看一下版本号来验证是否安装成功了。

gcc -v // 查看gcc版本号

有下面版本号的话一般问题就不大了。
在这里插入图片描述
这里说一下,gcc默认支持的语法是比较老的,像一些C99的语法可能有一些不支持,可以去网上搜一个gcc配置C99的教程去配置一下,当然也可以每次编译的时候带上语法提升命令也行。
配置C99语法链接

gcc test.c -std=c99 -o test.exe // 编译test.c文件,用C99语法,且编译的可执行文件为test.exe

然后g++也是一个Linux下的编译器,跟gcc十分相似,我估计g++底层可能就是用到了gcc的一些功能也不奇怪。然后需要注意的是g++是编译c++代码的,CPP后缀可以是xxx.cc 或者是 xxx.cxx

2.gcc编译过程

对于C或者CPP这样的语言,编译需要执行两个大的过程,一是编译,二是链接。

2.1编译 和 链接

在编译环境下又可以分为预处理、编译、汇编三部分和最后的链接,可以参见下图:
在这里插入图片描述
在这里插入图片描述
● -E 完成预处理后停止编译,生成xxx.i文件
● -D 命令行式添加宏
在这里插入图片描述
● -S 完成编译后停止编译,编译后是一些汇编语言,生成xxx.s文件
在这里插入图片描述
● -c 完成汇编后停止编译,汇编后是一些二进制语言,生成xxx.o文件

2.2编译步骤形成的原因

之所以上面说的编译部分分为预处理、编译、汇编这么麻烦,是由于历史原因导致的。
在这里插入图片描述
是这样的,在计算机刚出现的时候,我们人类直接拿着二进制跟计算机交流,计算机也能听得明白。
后来科学家觉得用二进制跟计算机交流太麻烦了,十分逆反我们人类的语言习惯,就用二进制写了个语言,叫汇编语言。这时候汇编语言计算机就看不懂了,只能先把汇编语言翻译成二进制然后计算机才能看的明白。
随着计算机的发展,汇编也不好使了,人们还是觉得汇编不够贴近人类语言习惯,就用汇编发明了后来的C、CPP、Java等高级语言。计算机只认识二进制,所以这些高级语言也得翻译成二级制才行。这时候有两种方式,一是直接把高级语言翻译成二进制,二是先把高级语言翻译成汇编,再由汇编翻译成二进制。
显然,当时科学家或者说是程序员选择了第二种方式,因为只需要把高级语言翻译成汇编就行了,汇编到二进制这活前人已经把这活干了。
所以就出现了比较繁琐的编译过程…

2.3编译器的自举

先有编译器还是先有对应的语言的呢???
先有编译器。没编译器怎么转化为二进制的对不对。那这个编译器怎么来的?用先前的语言写的。

我们拿汇编举例,汇编刚开始的时候只有二进制这种语言…然后科学家就拿着二进制硬搓了个汇编的编译器,然后才可以用汇编写代码。既然现在汇编语言可以用了,那我用汇编语言写个编译器不过分吧。所以说汇编译器就成了用汇编写的编译器了。我们把这个过程称之为编译器的自举

2.4链接

链接这个过程干的啥???
主要是把编好的各种文件组合在一起,包括一些函数库,自己写的一些源文件等等…

在链接库的时候(比如链接C语言标准库),有两种链接方式,即静态链接动态链接
库分为静态库和动态库两种,对应也有静态链接和动态链接两种。
静态链接:把所需要的库拷贝到自己文件中,在进行编译不需要依赖外界的库。
动态链接:十分依赖外界的库,再进行编译时会去访问外界的库。
● Linux下
○ 动态库:.so
○ 静态库:.a
● windows下
○ 动态库:.dll
○ 静态库:.lib

编译静态库指令:

gcc test.c -o static_test.exe // 编译动态文件,gcc默认就是动态链接
gcc test.c -o static_test.exe -static // 编译静态文件

静态链接与动态连接的优缺点:
Linux系统一般默认提供C动态库,但是对于静态库需要自己去下载和安装。
● 动态库(动态链接)
○ 优点:节约空间
○ 缺点:对函数库依赖性强,库一旦丢失,程序无法编译。
● 静态库(静态链接)
○ 优点:每个文件都需要单独的库内容拷贝,对函数库依赖性弱。
○ 缺点:浪费空间

gcc test.c -o dynamic_test.ext // 编译动态文件
gcc test.c -o static_test.exe -static // 编译静态文件
ls -d dynamic_test.exe static_test.exe -l // 输出两个文件详细信息

在这里插入图片描述
我们发现,静态链接生成的可执行文件大一点…

两种链接方式的应用:
两种库都有自己的应用场景,不过还是要以动态库为主流。
● 静态库适用于小型开发项目
● 动态库适用于大型开发项目团队之间的合作协调
原因:LINK


EOF

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

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

相关文章

案例实践 | 基于长安链的福建省气象综合治理区块链平台

案例名称-【福建省气象综合治理区块链平台】 ■ 实施单位 福建福链科技有限公司 ■ 业主单位 福建省气象信息中心 ■ 上线时间 2023年10月 ■ 用户群体 福建省气象、防灾减灾相关单位 ■ 用户规模 全省2100余个气象站、气象局以及防灾减灾部门 案例背景与解决痛点 …

【C++中线程学习】

1、多线程 C11之前没有引入线程的概念&#xff0c;如果想要实现多线程&#xff0c;需要借助操作系统平台提供的API&#xff0c;比如Linux的<pthead.h>&#xff0c;或者windows下的<windows.h>。 C11提供了语言层面上的多线程&#xff0c;包含在头文件<thread.h…

[微信小程序] css 解决纯数字或字母不自动换行的问题、控制文字行数

效果 css 代码 word-break: break-all; overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;解释 word-break: break-all; 作用&#xff1a;这个属性允许在单词内部进行换行&#xff0c;即使单词很长也…

正向解析、反向解析、DNS主从、DNS多区域、ntp时间同步

DNS配置回顾 编号主机名IP地址说明1web服务器192.168.1.17发布部署web服务2dns服务器192.168.1.20用于解析域名和IP地址3clien主机192.168.1.18用于模拟客户机 修改 client主机&#xff1a;修改了dns的访问主机&#xff1b;临时修改echo "nameserver IP地址"&…

【Git多人协作开发】不同的分支下的多人协作开发模式

目录 0.前言背景 1.开发者1☞完成准备工作&协作开发 1.1查看分支情况 1.2创建本地分支feature-1 1.3三板斧 1.4push推本地分支feature-1到远程仓库 2.开发者2☞完成准备工作&协作开发 2.1创建本地分支feature-2 2.2三板斧 2.2push推送本地feature-2到远程仓库…

redis构建集群时,一直Waiting for the cluster to join

redis构建集群时&#xff0c;一直Waiting for the cluster to join 前置条件参考 前置条件 这是我搭建的集群相关信息&#xff0c;三台虚拟机&#xff0c;分别是一主一从。在将所有虚拟机中redis服务器用到的tcp端口都打开之后&#xff0c;进行构建集群。但是出现上面的情况。 …

MyCms开源免费的自媒体商城博客CMS企业建站系统

MyCms是一款基于Laravel开发的开源免费的自媒体博客CMS系统&#xff0c;适用于个人网站及企业网站开发使用&#xff0c;MyCms基于Apache2.0开源协议发布&#xff0c;免费且不限制商业使用。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89575879 更…

DC系列靶场---DC 3靶场的渗透测试(一)

信息收集 Nmap扫描 nmap -sS -sV -T4 -p- -O 172.30.1.142//-sS TCP的SYN扫描 //-sV 服务版本检测 //-T4 野蛮的扫描&#xff08;常用&#xff09; //-O 识别操作系统 使用Nmap扫描只看到一个80端口&#xff0c;Apache的2.4.18版本。 http探测 使用Wappalyzer插件可以到…

防火墙限制docker了

今天有个安全方面的需求&#xff0c;演示环境禁止将3306等高危端口暴露到外网。 于是同事开启了防火墙&#xff0c;仅将应用端口暴露。结果导致演示环境无法使用。 由于公司的应用是基于docker部署的。结果他问我为什么同一台机器&#xff0c;应用无法访问mysql。 docker对于…

Apollo使用(3):分布式docker部署

Apollo 1.7.0版本开始会默认上传Docker镜像到Docker Hub&#xff0c;可以按照如下步骤获取 一、获取镜像 1、Apollo Config Service 获取镜像 docker pull apolloconfig/apollo-configservice:${version} 我事先下载过该镜像&#xff0c;所以跳过该步骤。 2、Apollo Admin S…

自动驾驶(八十七)---------虚拟机Hypervisor

在汽车电子电气架构发展中&#xff0c;SOA和中央计算是重要的趋势&#xff0c;boach的下图广为流传。因为仪表、座舱、智驾根据不同的需求选择不同的系统&#xff0c;这就导致虚拟机技术是实现中央计算的重要技术。 Hypervisor可以在一台硬件上运行多个虚拟机&#xff08;VM&am…

C# 知识点总结

入门 C#程序在.NET上运行&#xff0c;.NET framework包含两个部分&#xff1a; ①&#xff1a;.NET framework类库 ②&#xff1a;公共语言运行库CLR&#xff08;.NET虚拟机&#xff09; CLS&#xff08;公共语言规范&#xff09; CTS&#xff08;通用类型系统&#xff09; .N…

Leetcode3219. 切蛋糕的最小总开销 II

Every day a Leetcode 题目来源&#xff1a;3219. 切蛋糕的最小总开销 II 解法1&#xff1a;贪心 谁的开销更大&#xff0c;就先切谁&#xff0c;并且这个先后顺序与切的次数无关。 代码&#xff1a; /** lc appleetcode.cn id3219 langcpp** [3219] 切蛋糕的最小总开销 I…

智能爬虫管理:定制化数据抓取方案为企业赋能

摘要&#xff1a; 在数据驱动的时代&#xff0c;精准而高效的数据抓取成为企业决策的命脉。本文将探讨如何通过定制化的智能爬虫管理方案&#xff0c;赋能企业实现数据洞察力的飞跃。我们将深入解析定制化数据抓取的核心优势&#xff0c;分享成功案例&#xff0c;并揭秘如何利…

【HTML — 构建网络】HTML 入门

在本文中,我们将介绍 HTML 的绝对基础知识。为了帮助您入门,本文定义了元素、属性以及您可能听说过的所有其他重要术语。它还解释了这些在 HTML 中的位置。您将学习 HTML 元素的结构、典型的 HTML 页面的结构以及其他重要的基本语言功能。在此过程中,也将有机会玩转 HTML! …

动手学深度学习6.5 汇聚层-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;池化层_哔哩哔哩_bilibili 本节教材地址&#xff1a;6.5. 汇聚层 — 动手学深度学习 2.0.0 docume…

数据结构--二叉树详解

一&#xff0c;概念 1&#xff0c;结点的度&#xff1a;一个结点含有子树的个数称为该结点的度 2&#xff0c; 树的度&#xff1a;一棵树中&#xff0c;所有结点度的最大值称为树的度&#xff1b; 3&#xff0c;叶子结点或终端结点&#xff1a;度为0的结点称为叶结点&#x…

C++内存管理(候捷)第四讲 笔记

上中下三个classes分析 Loki allocator的三个类&#xff0c;从低阶到高阶分别为&#xff1a;Chunk, FixedAllocator, SmallObjAllocator Chunk&#xff1a;pData指针&#xff0c;指向分配的一个chunk&#xff0c;firstAvailableBlock_索引&#xff0c;指向第一个可用区块是第几…

WHAT - 一个 Github 仓库的 License 如何解读

目录 一、背景二、解读许可证说明的作用常见的开源许可证类型使用他人代码仓库时需要注意的事项结论 实践作为开发者1. 选择许可证类型2. 在 README 文件中编写许可证信息 作为使用者1. 确定权限2. 了解和遵守条款 总结 一、背景 我们经常在一些 Github 仓库里看到 License 部…

GAMES104:05游戏引擎中的渲染系统2:渲染中的光照、材质和shader-学习笔记

文章目录 一、渲染方程及其挑战二、基础光照解决方案-简化版简化光源简化材质简化阴影 三、基于预计算的全局光照3.1挑战和计算思路傅里叶变换球谐函数&#xff08;Spherical Harmonics&#xff09; 3.2 SH Lightmap&#xff1a;预计算 GI3.3 探针 Probe&#xff1a;Light Prob…