前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >初识Linux · 有关gcc/g++

初识Linux · 有关gcc/g++

作者头像
_lazy
发布于 2024-10-16 06:34:21
发布于 2024-10-16 06:34:21
14303
代码可运行
举报
文章被收录于专栏:Initial programmingInitial programming
运行总次数:3
代码可运行

前言:

继上文介绍了vim 和 yum,相当于介绍了 文本编译器,我们可以利用vim写代码,那么写代码的我们了解了,现在应该了解编译器了吧?这不,gcc 和 g++就出来了,我们就简单介绍一下gcc 和 g++的一些区别,咱们的侧重点是在程序的翻译上面。

1 gcc和g++

我们没有了解到gcc和g++之前,在Linux上甚至没有办法编辑代码,那么现在我们可以了,gcc是一个只能编辑C语言代码的编辑器,我们使用的时候大概率会出现版本问题,g++同理,是一个编辑C++语言的编辑器,同时,也可以编辑C语言的代码。

刚才提及到的版本问题,这里演示:

当我们在.c文件里面写了for循环之后,gcc就编辑不了,说这是C99的,而因为我们编译器的版本没有升级,所以我们需要加上:

这就可以完成版本为C99的编译了,-o是指定编译成什么名。

在C++中,vs的后缀一般是.cpp,在Linux中,C++文件名的后缀可以是.cc .cpp甚至可以是.cxx,我们来编译试试:

这样就可以了,那么我们试试gcc编译C++的代码呢:

就会报这么一大堆的错误,说白了,就是gcc不认识C++中流罢了。

当然了,有的时候我们写代码写了新特性,就会导致编译失败,我们多注意,或搜索升级一下g++ gcc就可以了。


2 翻译过程

我们写好了代码,编译器成功编译了,我们不免会好奇,代码是如何经过一层一层的编译,逐渐变成了一个一个我们不认识的字符的?

那么就不免提及翻译过程,其实在C语言阶段我们就或多或少接触了些底层知识,比如汇编,比如代码编译的时候分为预处理,编译,汇编,链接部分。本文就着重于这四个部分,进行编译器背后的故事的介绍了。

2.1 预处理

结合C语言阶段的编译链接知识,我们知道预处理阶段是进行宏替换,头文件展开,去掉注释等工作的,还牵扯到了条件编译部分,那么我们想要看预处理阶段的代码怎么看呢?

只需要gcc -E test.c -o test.i即可:

这是我们的测试代码:

编译成功之后,我们使用vim打开文件看看:

800多行,可以判定为头文件展开了,M的位置变成了100,代表宏替换也完成了。中间的一大堆注释也不见了,可以判定为去掉注释成功了。

这里简单带一下条件编译的内容,主要用到指令 -D,测试代码为:

编译也是没有问题的,我们先来默认编译一下:

默认打印的是0,那么我们使用-D快捷定义一下:

D和V1之间可以空格可以不空,这就是条件编译。

此时可以发现里面的除了定义V2留下的,其他都没有了就,这是预处理阶段。

2.2 编译

可以发现,经过预处理部分,我们的代码还是C语言的代码,代码的本质是没有发生改变的,那么在编译阶段,代码开始变为汇编语言了,使用的指令就是gcc -S test.i ,我们可以从.c文件开始编译,也可以从.i文件开始编译,从.c文件开始无非就是走一次预处理阶段。

当我们打开了这个test.s文件,可以发现里面的东西已经变成了我们不认识的,说白了,就是变成了汇编代码,往后看:

就跟我们Vs调试的底层没有区别,都是些助记符什么的。

2.3 汇编

到汇编阶段的时候,我们就更看不懂了,因为这是从汇编阶段转向了二进制目标文件,其实我们平常也是经常接触的,比如:

.obj就是目标文件,在Linux中对应的目标文件我们需要使用gcc -c test.s -o test.o来完成:

里面就是诸如此类的乱码,这是在汇编阶段要做的事。

那么,我们是否思考过为什么代码编译的时候是从C语言->汇编->二进制目标文件的吗?

这就不得不牵扯到历史故事了,这是一个编译器自举的过程

最开始是只有二进制的,使用的是二进制的打点方式来表达的代码,那么我们想要编译这个代码,就需要一个二进制的编译器,此时,对应了汇编部分的.o文件。前人使用二进制编写了一个二进制的编译器,这是前提。语言是跟随着时代发展的,所以后面许多语言就发明出来了,但是对应的编译器从哪里找呢?从头研发一个吗?好像有点麻烦,我们不是已经有了基础吗?就是二进制的编译器,前人使用二进制语言编写了两个X语言的编译器,A编译器编译B,获得了B.exe,那么B.exe的本质就是二进制语言,我们修改B.exe只需要不停的修改源代码,再使用A编译器就可以完成编译器的修改,此时基本过程已经创建,二进制编译器编译了一个X语言的编译器,那么编译X语言的时候就会走到二进制。而语言的发展是二进制到汇编的,所以,过程是C语言到汇编到二进制,二进制编译X语言的编译器,使得B.exe变成一个完美的X语言的编译器这个过程叫做编译器的自举。

对于历史故事我们应该了解一下。

2.4 链接

好了,预备工作已经做好了,现在只需要生成可执行文件就行了,此时就是链接要做的事情,那么为什么存在链接的这个过程呢?链接的过程是在做什么呢?怎么做的呢?这是我们在链接部分要考虑的事:为什么?是什么?怎么做?

第一个问题,什么是链接?

我们是否思考过为什么我在文本编译器里面写上了printf,引用一个头文件就可以实现打印了,难道是只需要一个头文件就可以使用函数吗?

并不完全是的,函数确实是在头文件里面没有错,但是呢,头文件来源于哪里呢?我们学习计算机的都应该知道,C语言有自己的标准库,C++有自己的标准库,那么标准库存放的是什么?标准库存放的是头文件没有问题,那么标准库在哪里呢?

所以,就牵扯到了链接了,我们写下了代码,引用了头文件,本地配置就会和标准库建立链接,所以我们才能够完成函数调用。

我们平常查看任务处理器的时候,不免的会发现很多.dll文件,或者是.lib文件,这实际上就是标准库,我们在安装编译器的时候,安装的不仅仅有头文件,还有该语言的标准库。

安装任何软件的时候,如果说涉及到了库,在Linux中,.so是动态库,.a是静态库,在windows中,.dll是动态库,.lib是静态库。

我们可以使用ldd命令来查看一个可执行程序,会打印出链接的什么库。我们可以看到/lib64/libc.so.6,库的名称是去掉前缀,再去掉后缀,前缀是lib 后面是.so.6,留下的是一个c,代表这就是C语言的标准库。因为是.so,所以这是一个动态库。

那么为什么有库的概念,这是因为可以提高效率,让我们粘在巨人的肩膀上。

那么为什么有静态库和动态库的概念?动态库可以理解你去网吧上网,使用了网吧的机器,静态库可以理解为你把网吧的机器搬回来了,那么二者的区别在于,动态库地方集中一个点,方便压缩空间,而静态库的区别是每个人都要拿一台电脑,会导致重叠的空间变大,导致效率不够高。

我们可以看看动态库和静态库的大小区别,当然了,因为静态库的大小确实很大,所以一般机器上是默认没有安装的,安装的指令如下:

sudo yum install glibc-static libstdc++-static

可以看到大小相差了一百倍之多,那么静态库的应用场景是什么呢?

比如你希望你的程序具有很强的跨平台性,过去了不用配置其他东西,那么你使用静态库,将所有东西都拷贝一遍,跨平台了自然就不需要配置了。

这就是链接部分的些许介绍。

感谢阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
标签体系下的用户画像建设小指南
用户画像是指根据用户的属性、用户偏好、生活习惯、用户行为等信息而抽象出来的标签化用户模型。通俗说就是给用户打标签,而标签是通过对用户信息分析而来的高度精炼的特征标识。通过打标签可以利用一些高度概括、容易理解的特征来描述用户,可以让人更容易理解用户,并且可以方便计算机处理。
王知无-import_bigdata
2021/07/12
4.5K0
标签体系下的用户画像建设小指南
用户画像数据建模方法
点击标题下「大数据文摘」可快捷关注 作者:百分点技术总监郭志金 摘自:百分点(ID: baifendian_com) 从1991年Tim Berners-Lee发明了万维网(World Wide Web)开始,到20年后2011年,互联网真正走向了一个新的里程碑,进入了“大数据时代”。经历了12、13两年热炒之后,人们逐渐冷静下来,更加聚焦于如何利用大数据挖掘潜在的商业价值,如何在企业中实实在在的应用大数据技术。伴随着大数据应用的讨论、创新,个性化技术成为了一个重要落地点。相比传统的线下会员管理、问卷调查、
大数据文摘
2018/05/22
1.8K0
用户画像从入门到挖坑
背景 用户流量从搜索引擎为入口的增量时代到移动互联网普及人口红利不再的存量时代,这个变化对每个公司的获客成本,运营思路都产生了很大的影响,在流量日益枯竭,获客成本越来越高的时代,伴随着大数据、精细化运营、人工智能、机器学习等一大波新技术和概念的崛起、普及,它们之间有何关联?如今互联网产品又该如何运营、攻城略地?本文介绍的用户画像或许能带来一点思路。 1、用户画像的作用与意义 1.1 作用 用户画像承载了两个业务目标:一是如何准确的了解现有用户;二是如何在茫茫人海中通过广告营销获取类似画像特征的新用户。比如在
用户1177713
2018/02/24
4.1K0
用户画像从入门到挖坑
互联网产品如何建立用户画像?
过年时,闲来无聊,便想起年前和啊喔科技的的朋友聊到过“不写就出局”用户活跃度的话题,大家共同讲起了需要建立产品的用户画像。去年十月,雨花客厅程冲老师在产品课程上也讲过用户调研和分析方法。这两天想梳理出来所学所思:用户画像到底是什么?该如何创建用户画像?用户画像到底有什么作用?
黄成甲
2018/09/12
2.8K0
互联网产品如何建立用户画像?
大数据时代,如何构建精准用户画像,直击精细化运营
移动互联网时代,精细化运营逐渐成为企业发展的重要竞争力,“用户画像”的概念也应运而生。用户画像是指,在大数据时代,企业通过对海量数据信息进行清洗、聚类、分析,将数据抽象成标签,再利用这些标签将用户形象具体化的过程。用户画像的建立能够帮助企业更好地为用户提供针对性的服务。
个推
2019/04/08
1.5K0
大数据时代,如何构建精准用户画像,直击精细化运营
基于大数据的用户画像构建小百科全书
用户画像是指根据用户的属性、用户偏好、生活习惯、用户行为等信息而抽象出来的标签化用户模型。通俗说就是给用户打标签,而标签是通过对用户信息分析而来的高度精炼的特征标识。通过打标签可以利用一些高度概括、容易理解的特征来描述用户,可以让人更容易理解用户,并且可以方便计算机处理。
Spark学习技巧
2021/03/05
1.3K0
基于大数据的用户画像构建小百科全书
58用户画像实践
作为世界最大的生活服务平台,我们同样也希望用户知道“58就在那儿!”。要做到这一点,我们首先就需要具有对用户洞若观火、明察秋毫的能力,而58用户画像的建设就是以此为目标的。
Spark学习技巧
2019/10/28
4.6K0
58用户画像实践
基于大数据的用户画像构建(理论篇)
文 | 罗宇矗 什么是用户画像? 简而言之,用户画像是根据用户社会属性、生活习惯和消费行为等信息而抽象出的一个标签化的用户模型。构建用户画像的核心工作即是给用户贴“标签”,而标签是通过对用户信息分析而来的高度精炼的特征标识。 举例来说,如果你经常购买一些玩偶玩具,那么电商网站即可根据玩具购买的情况替你打上标签“有孩子”,甚至还可以判断出你孩子大概的年龄,贴上“有5-10岁的孩子”这样更为具体的标签,而这些所有给你贴的标签统在一次,就成了你的用户画像,因此,也可以说用户画像就是判断一个人是什么样的人。 除去“
CDA数据分析师
2018/02/24
2.3K0
基于大数据的用户画像构建(理论篇)
大数据分析技术方案
现在已经进入大数据时代, 数据是无缝连接网络世界与物理世界的DNA。发现数据DNA、重组数据DNA是人类不断认识、探索、实践大数据的持续过程。大数据分析可以有效地促进营销,个性化医疗治病,帮助学生提高成绩,利于老师提高教学水平,还可以用于教学,许多产品可以用到大数据技术,如量化分析金融产品等。必须加强大数据技术的研究并实际应用.这里对目前最流行和最实用的用户画像技术进行讲解,并分析大数据分析的常用算法。
全栈程序员站长
2022/09/20
1.8K0
大数据分析技术方案
【用户画像】从0到1掌握用户画像知识体系
随着用户的一切行为数据可以被企业追踪到,企业的关注点日益聚焦在如何利用大数据为经营分析和精准营销服务,而要做精细化运营,首先要建立本企业的用户画像。
全栈程序员站长
2022/09/01
2.1K0
【用户画像】从0到1掌握用户画像知识体系
超硬核 | 一文带你入门用户画像
之前开发过一个画像项目,并为大家介绍了项目过程中部分开发的细节,例如PSM,RFE,USG等模型的标签开发落地。但是后来考虑到对于没有画像开发经验,尤其是零基础的大数据小白而言不是很友好,理解起来也不是很容易。正好最近在看一些文献资料,所以,我又专门开了一个专题,打算重新为大家讲解关于用户画像的知识。感兴趣的小伙伴记得关注加星标,每天第一时间收获技术干货!
大数据梦想家
2021/01/27
1.8K0
超硬核 | 一文带你入门用户画像
数据分析思维和方法:用户画像分析
我们经常在淘宝上购物, 作为淘宝方, 他们肯定想知道他的使用用户是什么样的, 是什么样的年龄性别, 城市, 收入, 他的购物品牌偏好, 购物类型, 平时的活跃程度是什么样的, 这样的一个用户描述就是用户画像分析。
Python数据科学
2021/02/01
1.6K0
数据分析思维和方法:用户画像分析
【数据分析思维】能落地的用户画像长啥样?
用户画像,大数据时代老生常谈且又长久不衰的话题,公司都在搞,文章满天飞,在这个人人都喊“数据驱动业务”的时代,你不懂用户画像,不搞用户画像,你都不好意思跟别人聊(chui)业(niu)务(pi)。
数据万花筒
2021/07/05
1K0
【数据分析思维】能落地的用户画像长啥样?
干货 | 用户画像在携程商旅的实践
用户画像这一概念最早源于交互设计领域,由交互设计之父Alan Cooper提出。其指出用户画像是真实用户的虚拟代表,是建立在真实数据之上的目标用户模型。具体而言,在互联网用户分析领域,用户画像可以简单描述为用户信息标签化,即通过收集并分析用户的社会属性、生活习惯、消费偏好等各维度的数据,从而抽象出用户的全方位多视角的特征全貌,最终就是让用户画像比用户更了解自己。
携程技术
2020/07/20
2.6K0
大数据【企业级360°全方位用户画像】项目介绍
在正式开始对【企业级用户画像】项目展开介绍之前,博主可是煞费苦心,为大家整理了一期,如何彻底理解什么是用户画像(?一文让你彻底明白,到底什么是用户画像?)。如果确实帮到您了,不妨给博主一个大大的赞|ू
大数据梦想家
2021/01/27
2.1K0
大数据【企业级360°全方位用户画像】项目介绍
用户画像--《美团机器学习实践》笔记
用户模型和用户画像的区别。用户模型是指真实用户的虚拟代表,在真实数据的基础上抽象处理的一个用户模型,是产品在描述用户需求时使用的概念。用户画像是从海量的用户数据中,建模抽象出每个用户的属性标签体系,这些属性通常要具有一定的商业价值。
languageX
2023/02/01
5.7K0
你以为自己真的了解用户画像?其实猫腻可多了
作者 CDA 数据分析师 背景 刘路老师之前主要是做政府数据分析,目前主要服务企业。他认为政府和企业的数据分析没有本质区别,都是有目的的进行收集、整理、加工和分析数据,提炼有价值信息的过程,都是为
CDA数据分析师
2018/02/26
8170
你以为自己真的了解用户画像?其实猫腻可多了
干货请收好:终于有人把用户画像的流程、方法讲明白了
导读:用户画像将产品设计的焦点放在目标用户的动机和行为上,从而避免产品设计人员草率地代表用户。产品设计人员经常不自觉的把自己当作用户代表,根据自己的需求设计产品,导致无法抓住实际用户的需求。往往对产品做了很多功能的升级,用户却觉得体验变差了。
IT阅读排行榜
2018/12/10
5.4K0
干货请收好:终于有人把用户画像的流程、方法讲明白了
个推用户画像的实践与应用
“以用户为核心”的概念在互联网时代深入人心,然而要真正了解用户懂得用户,就不得不提到“用户画像”。 随着大数据技术的深入研究与应用,借助用户画像,企业或APP可以深入挖掘用户需求,从而实现精细化运营以及为精准营销打下坚实基础。本文将重点介绍何为用户画像,用户画像的构建流程以及应用场景。
个推
2019/01/29
2K0
个推用户画像的实践与应用
终于有人把用户画像的流程、方法讲明白了
导读:用户标签是个性化推荐、计算广告、金融征信等众多大数据业务应用的基础,它是原始的用户行为数据和大数据应用之间的桥梁,本文会介绍用户标签的构建方法,也就是用户画像技术。
IT阅读排行榜
2021/07/12
4.4K0
推荐阅读
相关推荐
标签体系下的用户画像建设小指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验