【Linux】Linux工具——gcc/g++

1.使用vim更改信用名单——sudo

我们这里来补充sudo的相关知识——添加信任白名单用户

使用sudo就必须将使用sudo的那个账号添加到信用名单里,而且啊,只有超级管理员才可以添加

信用名单在/etc/sudoers里

我们发现它的权限只是可读啊,所以我们怎么修改它呢?

我们可以使用vim

 注意此时不要滚动鼠标的滑轮

我们按hjkl来移动

找到下面这一行的

 我们这个时候还是处于命令模式,我们移动到这一行,

 yy+p

我们点击i切换到插入模式,将%wheel改成我们想添加的用户名

好了之后,我们先按Esc回到命令模式,然后我们输入:切换到底行模式,输入wq!强制保存退出

2.Linux编译器-gcc/g++使用

gcc只能用于编译c语言,g++既可以编译c语言也可编译c++

我们只讲gcc,因为它和g++的用法基本一样

2.1.gcc使用示例

我们先创建

我们点击i进入插入模式,输入下面这段代码

 

我们按Esc,然后输入:进入底行模式,输入wq 

 我们代码写好了,那我们怎么编译呢?

我们使用gcc

正常情况下我们编译完什么也不会有

当然我们的代码出错的情况下,就会报错

我们修改正确的代码后,编译代码 

我们看看当前目录有什么

gcc在编译完成后默认形成的可执行文件a.out,它的名字和后缀是什么并不重要,因为后缀在linux系统没啥意义(我们之前讲过)

 我们只关注它的属性里是不是有x这个权限(可执行权限)

有x权限,我们可以直接运行这个程序

很完美

 2.2.g++使用示例

上面我们编译的是c语言,现在我们来编译一下c++的代码

注意:我们使用g++前要先确保我们安装了,如果没有安装,就要像下面这么做

我们编译一下 ,并运行

 我丢,这个属性和上面那个gcc编译出来的不是一模一样的吗!!!

说明啊gcc/g++是同宗同源的啊

gcc不能编译c++,g++可以编译c语言和c++

 2.3.gcc使用背景知识

2.3.1.预处理部分(进行宏替换)

我们先看预处理

我们使用gcc来一次性演示a,b,d的知识

 我们先准备我们的c语言代码

我们对比一下之前的mycode.i

 我靠,直接预处理了七百多行

右边这么多都是从c语言库里拷贝过来的,这个就叫头文件展开

预处理后,就不需要头文件了,因为都拷贝过来了

翻到最后就是我们的代码,发现注释的内容已经被裁掉了,这个叫去注释

我们看到M已经被替换成100,这个就是宏替换(不做语法检查,在编译之前就替换了)

我们为什么能在windows或者linux上进行c/c++或其他形式的开发?

我们的系统中一定要提前或者后续安装上,c/c++开发相关的头文件,库文件

c/c++开发环境不仅仅指的是vs,gcc,更重要的是c语言/c++的头文件

linux的这些头文件默认存在/usr/include/

有没有眼熟的头文件啊

我们找到stdio.h,进去看看

很多内容啊,在头文件展开阶段就是从这里拷贝相关的内容过去的

所以我们安装vs2022等开发环境,其实我们在安装的时候,选择对应的开发包——本质是同步下载c/c++的头文件和库文件

那么问题来了,我们既然要包括我们的头文件,那么我们为啥不像下面这样子写

这个是因为,编译器知道我们的这个头文件放在哪里,所以就不用写路径了

c/c++的头文件和库文件在windows下也是存在的

我们可以使用everything来找

我们看看c.条件编译 

宏全不见了,只剩了printf("hello relese!"),这个是因为我们根本没有定义DEBUG

我们可以在gcc里面定义DEBUG

编译器具有自动修改代码的功能,所以我们使用gcc在外部添加一个宏是没有任何问题的

这个就叫条件编译

条件编译的运用场景

我们用软件的时候肯定听过社区版(免费),开发版/专业版(收钱)

  • 社区版提供最基础的功能
  • 专业版提供最新,最好的功能

那么问题来了——提供这些软件的公司需要维护两份代码吗?

肯定不需要,公司根据不同的编译条件裁剪掉社区版不需要的功能即可实现社区版和专业版的区分

2.3.2.编译部分 (生成汇编)

 预处理完后,还是c语言吗?

当然是啊,只不过是更简洁的c语言

我们看看编译部分

 这样子我们就将c语言形成了汇编语言

 2.3.3.汇编部分(生成机器可识别代码)

我们接着将生成的汇编代码转成机器可识别代码

全是乱码,很正常 ——mycode.o是二进制的,vim是文本编辑器

所以我们得借助二进制查看工具

2.3.4.链接部分( 生成可执行文件或库文件)

我们就生成了一个可执行程序

2.4.gcc选项的含义

1.我们直接gcc不带任何选项,代表直接生成可执行程序

2.-o 文件输出到 文件

-o后面永远跟着可执行文件

gcc 待编译的文件 -o 生成的可执行文化的名称

生成可执行文件并自定义可执行文件的名字

这个命名的后缀随便写,都能执行,因为linux的后缀没有什么意义

甚至下面这种写法也可以

 3.-E 只激活预处理部分,这个不生成文件,你需要把它重定向到一个输出文件里面

直接给你打印到显示屏幕来了

-E后面永远紧跟着要预处理的目标源,-o后面永远跟着要形成的目标文件

目标文件随便命名

4.    -S  将c语言编译到汇编语言     (即完成编译部分,  但不进行汇编和链接 部分)

我们可以从.c文件开始再进行预处理,再到这里

但是我们有现成的已经预处理完了的mycode.i

文件名和后缀随便命名

汇编语言的后缀全用.s,文件名就设置成带.s后缀

5.  -c  生成机器可识别代码

从现在开始进行程序的翻译,将汇编工作做完就停下来

我们可以从.c文件开始再进行预处理,再到这里

但是我们有现成的已经预处理完了的mycode.i

我们重定位目标二进制文件,简称目标文件,在windows下是.obj文件

这个文件不可以独立执行,虽然已经是二进制了,它还需要进行链接,才能执行

根本不让你运行,给了你x权限还是不能执行

我们需要进行最后一步链接,才能执行

将可重定位目标二进制文件和库进行链接,形成可执行文件

 上面这个生成可执行文件的全过程怎么记忆呢?

我们看看键盘左上角的Esc键,就是这个顺序

记住ESc即可

2.5.库

库就是函数库的意思,只是简称了:库=函数库
当函数(代码块)实在太多太多了,放在一个文件已经合理的时候又会被拆分到很多很多文件中去。当这些充满函数的文件放在一起时就是就形象的称之为函数库或库了。所以这个库就是一个存满函数文件的仓库。

链接就是在链接库

库,给我们提供方法的实现

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

c标准库在linux的这个目录里

库的本质就是一个文件

linux里面的库 :以.so结尾的,叫动态库,有.a结尾的,叫静态库 

windows里面的库:以.dll结尾的(动态库),.lib(静态库)

上面那个就是c语言的动态库

库有自己的命名规则:(前缀)lib     名字   .so.XXX(后缀) 

我们看回上面那个库libc.so.6,对应名字就只有一个c,那就是c语言的库了

我们的机器上默认安装了动态库,静态库默认没有安装的

 那就说明一个事实,对于编译型语言,安装开发包,必定是下载安装对应的头文件+库文件

头文件提供方法的声明+库文件提供方法的实现+你的代码=你的软件

 库存在的价值就是不让我们做重复工作,站在巨人的肩膀上

2.6.   .o文件和库是怎么链接的

这个有两种方案,我们这里只讲原理

2.6.1.动态链接

我们来看看动态库的定义

动态函数库就是存放在系统中的某个特定位置,提供了一些大部分程序都会使用到的功能集合。
这样主程序
在编译的过程当中就不需要把这部分功能编译到自己的程序中。只需要到系统中特定的位置直接调用动态函数库的功能就行了。

  • 好处:动态库是共享库,有效的节约资源,程序自身的体积不会因为动态函数库变大
  • 缺点:就是程序运行过程中使用到了这些函数库内的功能时,万一系统特定的位置没有对应的动态库,就会造成程序崩溃或者各种奇怪的问题。影响的不止一个程序,可能会影响很多程序

我们在linux里来看看

ldd可以查看可执行程序所依赖的动态库

如果我们把这个动态库删了,这个可执行程序就不能跑了

linux系统的很多指令是用c语言/c++写的可执行程序,我们来看看它们依赖的动态库

我们删掉了这个动态库就不能用pwd指令了

 

2.6.2.静态链接

静态链接:在编译器使用静态库进行静态链接的时候,会将自己的方法拷贝到目标程序中,改程序以后不再用依赖于静态库

我们了看看静态库的定义

当一个程序还是代码的时候,通过编译器把代码编译二进制文件以供计算机可以读取运行。那些庞杂的用于完成特定功能的函数代码仓库的文件随着程序代码文件一起被编译成二进制文件成为程序的一部分。这部分函数代码文件就叫做静态函数库。

  • 好处:就是程序可以独立运行,运行时不在依赖外部某些特定的功能。
  • 缺点:会造成程序的体积会变大,比较消耗资源。

2.6.3.静态库和动态库的区别

1、他们在哪里?
动态库在系统中,有没有这个程序劳资就在这里,
静态库在程序中,程序到哪我到哪

2、更新
动态库更新:劳资要更新了,就更新了。
静态库更新,要向自身程序说老大,小弟要更新了。大佬回复:晓得嘛,我更新时你才能更新,我不更新,你急啥子嘛。

所以如果程序运行时缺少某个库时,那就是动态库。只要到网上下载一个点点大的文件就行了。
静态库更新,只有程序要更新添加新的功能的时候,一般同时会自己更新静态库。

3、如果动态库版本差距太大,有可能和程序不兼容,这时候就需要看看,去下载一个对应版本的动态库文件,还是更新自己的程序。因为最新的程序一般都和最新的动态库兼容。
 

 2.6.4.验证部分

 我们回到上面那个,gcc默认使用动态链接,动态链接默认使用动态库,不能使用静态库

我们要是想用静态链接,就要用

 

注意:我们使用这个还要安装一个东西---自己去搜

我们看到这个动态链接的可执行程序所占内存明显更小,这个我们上面讲过这个原因了

基于这个原因,我们很少使用静态库

我们的云服务器默认只装了动态库,我们要装静态库——去百度

  1.  没有静态库,我们不能使用-static
  2. 没有动态库,只有静态库,而且gcc/g++能找到,gcc默认优先动态链接,-static的本质就是改变优先级
  3. 一个可执行程序不一定是全都是动态链接,或者全是静态链接,如果加了-static,就会将所有的链接要求全设置为静态链接

2.7.debug和release

 好熟悉是不是!!!!

debug程序是可以被追踪,因为它添加了debug信息

gcc默认生成可执行程序是release,我们可以使用选项-g来生成debug版本

 拓展:可执行程序形成的时候,不是无顺序的二进制构成,有自己的格式——可执行程序有自己的二进制格式——ELF格式

 

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

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

相关文章

分享:重庆耶非凡科技有限公司人力资源项目靠不靠谱?

在当今快速变化的商业环境中,人力资源项目作为企业发展的重要支撑,其专业性和可靠性成为企业选择合作伙伴时的重要考量因素。重庆耶非凡科技有限公司作为一家在行业内颇具影响力的科技企业,其人力资源项目——人力RPO(招聘流程外包)项目&…

dm8 什么时候视图中统计的内存会超过OS

v$bufferpool和v$mem_pool视图记录着DMSERVER各组件的内存占用量。理论上跟OS看到的保持一致。但实际大多数场景下,OS中看到的数据远大于视图中的统计。这里面可能有内存泄漏的原因。不过也有的时候视图中的统计数据超过OS。下面就是这种情况: 上图中红线…

Java_Mybatis

Mybatis是一款优秀的持久层框架,用户简化JDBC(使用Java语言操作关系型数据库的一套API)开发 使用Mybatis查询所有用户数据: 代码演示: UserMapper: Mapper //被调用时会通过动态代理自动创建实体类,并放入IOC容器中…

用cloudflared 把家里电脑网站可以让任何人试用

一针见血说技术,通俗易懂去实现自己的想法 一、背景 搭建一个网站,或者有个自己开发的算法,需要供应少量的人免费服务,也可以用于向合伙人演示。需要一个云服务,要么购买。还得啰嗦学习一些网站的开通知识&#xff0…

单号日入50+,全自动挂机赚钱

大家好!今天我为大家精心挑选了一个极具潜力的副业项目——“游戏工作室自由之刃2:单号日入50,全自动挂机赚钱”。 传奇游戏,无疑是许多人心中那段青春时光的珍贵回忆。 即便是其手游版本,也依旧保持着极高的热度和人…

【教程】20个高级 Python 函数,让你编程更高效

在Python的编程世界中,函数是我们编写代码的重要工具之一。除了常见的内置函数外,Python还提供了许多强大而有趣的高级函数,它们可以帮助我们简化代码、提升效率,甚至在某些情况下让编程变得更加有趣。让我们一起来探索这些高级函数的奇妙之处吧! 1.enumerate() – 枚举函…

Chrome DevTools

Console 面板 此章节请打开 justwe7.github.io/devtools/console/console.html 一起食用 一方面用来记录页面在执行过程中的信息(一般通过各种 console 语句来实现),另一方面用来当做 shell 窗口来执行脚本以及与页面文档、DevTools 等进行交…

【C++进阶】深入STL之string:模拟实现走进C++字符串的世界

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:C模板入门 🌹🌹期待您的关注 🌹🌹 ❀STL之string 📒1. string…

VRRP

文章目录 VRRP基本原理技术背景VRRP作用VRRP概述VRRP名词解释VRRP路由器VRRP组虚拟路由器虚拟IP地址、MAC地址Master、Backup路由器 VRRP状态机Master/ Backup 路由器Master路由器:Backup路由器: VRRP的工作过程 VRRP基础配置![image.png](https://img-blog.csdnimg.cn/img_con…

05C零碎语法

C零碎语法 目录 文章目录 C零碎语法1.函数指针2.回调函数3.数据拷贝3.1静态内存分配![请添加图片描述](https://img-blog.csdnimg.cn/direct/54d44e32bb7944f0866d4ca1e2667ce8.png)### 4.1动态内存分配 字符串6.sizeof()和strlen()的区别7.strcpy()/strncpy()函数7.1**strcp…

中继器、集线器、网桥、交换机、路由器和网关

目录 前言一、中继器、集线器1.1 中继器1.2 集线器 二、网桥、交换机2.1 网桥2.2 交换机 三、路由器、网关3.1 路由器3.2 网关 总结 前言 理解这些设备的关键是他们运行在不同的层次上。之所以存在不同层的问题,是因为不同的设备使用不同的信息来决定如何交换。在典…

【Hive SQL 每日一题】统计指定范围内的有效下单用户

文章目录 测试数据需求说明需求实现 前言:本题制作参考牛客网进阶题目 —— SQL128 未完成试卷数大于1的有效用户 测试数据 -- 创建用户表 DROP TABLE IF EXISTS users; CREATE TABLE users (user_id INT,name STRING,age INT,gender STRING,register_date STRING…

外卖点餐系统 springboot+vue+element-ui

免费获取方式↓↓↓ 项目介绍038: http://localhost:8080/ 账号:weiguanke 123 系统登陆后展示 用户可视界面 – 登录页面 – 首页: – 店铺查找页面: 店铺查找 – 店铺页面 店铺管理者可视页面 – 店铺页面 店铺管理员…

XCP协议系列介绍02-基于ASAP2 Tool-Set生成A2l介绍

本文框架 1. 前言2. ASAP2 Tool-Set系统介绍2.1 ASAP2 Creator介绍2.2 ASAP2 Updater介绍2.3 ASAP2 Merger介绍2.4 ASAP2 Comparer及Checker介绍2.5 ASAP2 Modifier介绍2.6 ASAP2 Studio介绍 3. 项目实操说明3.1 项目实操建议3.2 工具下载地址及使用 1. 前言 在XCP观测及标定整…

【计算机组成原理】1.1计算机的软硬件组成(记录学习计算机组成原理)

文章目录 1.早期的冯诺依曼机2.早期冯诺依曼机的基本运行框图3.早期冯诺依曼机的特点4.现代计算机的结构5. 小结 本次及以后有关于计算机组成原理的文章,旨在做学习时的记录和知识的分享。不论是应对期末考试,还是考研都是很有帮助的。希望大家多多支持更…

基于Android Studio 实现的鲜花(购物)商城App--原创

一、高质量源码(非开源) 关注公众号:《编程乐学》 后台回复:24060201 二、项目演示视频 基于Android Studio 实现的鲜花商城App--原创 三、开发环境 四、设计与实现 1.启动页 启动页我们需要用到倒计时和跳转功能。 2.注册登录 …

chat3-Server接收数据并转发给所有Client

本文档描述了Server端接收到Client的消息并转发给所有客户端或私发给某个客户端 服务端为当前客户端创建一个线程,此线程接收当前客户端的消息并转发给所有客户端或私发给某个客户端 一、Server: 1.1.Server端添加将消息转化给客户端的代码。有用集合保存输出流,…

学习小记录——python函数的定义和调用

今日小好运,未来有好运。🎁💖🫔 分享个人学习的小小心意,一起来看看吧 函数的定义 函数通常来说就是带名字的代码块,用于完成具体的工作,需要使用的时候调用即可,这不仅提高代码的…

[数据集][目标检测]旋风检测数据集VOC+YOLO格式157张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):159 标注数量(xml文件个数):159 标注数量(txt文件个数):159 标注类别…

音频信号分析与实践

音频信号分析与实践课程,方便理解音频信号原理和过程 1.音频信号采集与播放 两种采样模式和标准的采样流程 人说话的声音一般在2kHz一下: 采样频率的影响:采样率要大于等于信号特征频率的2倍;一般保证信号完整,需要使用10倍以上的…