【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.rhkb.cn/news/338677.html

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

相关文章

cocos入门5:编辑器界面介绍

Cocos Creator是一款功能强大的跨平台游戏开发工具,其编辑器界面设计直观易用,提供了从资源管理、场景编辑到脚本编写等一站式解决方案。下面是对Cocos Creator编辑器界面的详细介绍: 一、界面布局 Cocos Creator编辑器界面通常包含以下几个…

渲染100为什么是高性价比网渲平台?渲染100邀请码1a12

市面上主流的网渲平台有很多,如渲染100、瑞云、炫云、渲云等,这些平台各有特色和优势,也都声称自己性价比高,以渲染100为例,我们来介绍下它的优势有哪些。 1、渲染100对新用户很友好,注册填邀请码1a12有3…

IDeal下的SpringBoot项目部署

一、首先找到自己的sql文件,没有就从数据库挪进来 二、在Maven下打包一下(点击package),看到BUILD SUCCESS就是打包好了 三、将上面两个文件分别挪到 linux 中对应的文件,没有就创建一个(我的是spring_blog…

常见算法(基本查找、二分查找、分块查找冒泡、选择、插入、快速排序和递归算法)

一、常见算法-01-基本、二分、插值和斐波那契查找 1、基本查找/顺序查找 需求1:定义一个方法利用基本查找,查询某个元素是否存在 数据如下:{131,127,147,81,103,23,7&am…

WordPress子比主题美化-首页动态的图片展示

WordPress子比主题首页动态的图片展示 WordPress子比主题首页添加动态的图片展示,其他程序也可以用,复制代码到相应位置即可,也可作为指定分类,重点内容等,可以适合各个场景,需要的自取。 图片展示: 教程…

Spring源码之BeanDefinition的加载

Spring源码之BeanFactory和BeanDefinition BeanFactory和BeanDefinitionBeanFactoryBeanDefinition源码分析创建AnnotationConfigApplicationContext对象注册配置类refresh方法 BeanFactory和BeanDefinition BeanFactory BeanFactory是Spring提供给外部访问容器的根接口&…

MVC和MVVM

MVC Model层:用于处理应用程序数据逻辑的部分,通常负责在数据库中存取数据 View(视图)处理数据显示的部分。通常视图是依据模型数据创建的 Controller(控制器)是处理用户交互的部分。通常控制器负责从视…

Yolov10笔记

一、前言 清华大学团队设计的Yolov10. 在这项工作中,我们主要从后处理和模型结构两方面进一步优化YOLO系列模型的性能和延迟平衡。我们首先为YOLO引入了端到端训练的一致双重分配,这在大大降低推理延迟的情况下保证了性能。此外,我们针对YOLO…

养生与健康|一起跟随林曦老师养个元气满满

暄桐是一间传统美学教育教室,创办于2011年,林曦是创办人和授课老师,教授以书法为主的传统文化和技艺,皆在以书法为起点,亲近中国传统之美,以实践和所得,滋养当下生活。    在暄桐教室的六阶…

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)计算机网络在信息时代对的作用 计算机网络的定义和分类 三种交换方法

计算机网络在信息时代扮演着至关重要的角色,它极大地改变了我们生活、工作和学习的方式。 计算机网络在信息时代的作用 信息共享与传播:计算机网络使全球范围内的信息快速共享成为可能,无论是新闻、学术研究还是娱乐内容,都可以…

【C++】类和对象——构造和析构函数

目录 前言类的六个默认构造函数构造函数1.构造函数的概念2.构造函数的特性 初始化列表1.构造函数整体赋值2.初始化列表 析构函数1.析构函数的概念2.析构函数的特性 前言 类和对象相关博客:【C】类和对象   我们前面一个内容已经讲了关于类好对象的初步的一些知识&…

【MyBatis】零基础从入门到进阶(源码级深入详解)

1 MyBatis概述 1.1 框架 ● 在⽂献中看到的framework被翻译为框架 ● Java常⽤框架: ○ SSM三⼤框架:Spring SpringMVC MyBatis ○ SpringBoot ○ SpringCloud ○ 等。。 ● 框架其实就是对通用代码的封装,提前写好了⼀堆通用…

数据库系统概论(个人笔记)(第三部分)

数据库系统概论(个人笔记) 文章目录 数据库系统概论(个人笔记)3、SQL介绍3.1 SQL查询语言概述3.2 SQL数据定义3.3 SQL查询的基本查询结构3.4 其他基本操作3.5 设置操作3.6 空值3.7 聚合函数3.8 嵌套子查询3.9 数据库的修改 3、SQL…

看车牌识别API如何应用到实际

车牌识别技术作为一种先进的识别系统,在现代城市的交通管理和安全领域扮演着日益重要的角色。本文将深入探讨车牌识别API 接口在智能停车、安全监控以及数据分析等方面的具体应用。通过详细研究这些应用场景,我们可以更好地理解这项技术如何提升交通流畅…

Laravel和ThinkPHP框架比较

一、开发体验与易用性比较 1. 代码可读性: - Laravel以其优雅的语法和良好的代码结构著称,使得代码更加易读易懂。 - 相比之下,ThinkPHP的代码可读性较为一般,在一些复杂业务场景下,可能会稍显混乱。 让您能够一站式…

WordPress中借助Table of Contents Plus+Widget Options插件,实现仅在文章侧边栏显示文章目录的功能

本文转自博主的个人博客:https://blog.zhumengmeng.work,欢迎大家前往查看。 原文链接:点我访问 序言:今天心血来潮,写了一篇文章,忽然发现自己的文章极少有目录,这对于长文章的阅读来说是十分不利的&#…

Day 10:100322. 删除星号以后字典序最小的字符串

Leetcode 100322. 删除星号以后字典序最小的字符串 给你一个字符串 s 。它可能包含任意数量的 ‘’ 字符。你的任务是删除所有的 ’ 字符。 当字符串还存在至少一个 ‘*’ 字符时,你可以执行以下操作: 删除最左边的 ‘*’ 字符,同时删除该星号…

STM32(十):SPI (标准库函数)

前言 上一篇文章已经介绍了如何用STM32单片机中USART通信协议来串口通信,并向XCOM串口助手发送信息。这篇文章我们来介绍一下如何用STM32单片机中SPI接口来实现LED的闪亮并玩转WS2812B灯带。 一、实验原理 串行通信之前的博客里有所介绍,可以查看以下…

python中利用cartopy库绘制SST图像

1. Cartopy简介 Cartopy 是一个开源的 Python 库,用于绘制地图和地理数据分析。它结合了 matplotlib 的绘图功能和 shapely、pyproj 等库的地理空间数据处理能力,为用户提供了在地图上可视化数据的强大工具。 以下是 Cartopy 的一些主要特点和功能&#…