Linux开发工具【gcc/g++】

news2024/12/25 16:23:28

Linux开发工具之【gcc/g++】

上文我们已经学习了vim编辑器的相关操作和使用,已经可以在Linux下编写代码了,有了代码就需要编译运行,此时就需要用到Linux中的编译工具gcc/g++了,其中gccC语言的编译器,g++C++的编译器,下面我们一起来学习一下吧


文章目录:

  • Linux开发工具之【gcc/g++】
  • 1. Linux编译器gcc/g++使用
    • 1.1 目标文件
    • 1.2 预处理
    • 1.3 编译
    • 1.4 汇编
    • 1.5 链接
  • 2. 库
    • 2.1 动态库
    • 2.2 静态库
  • 3. 自动化构建工具make/Makefile
    • 3.1 概念引入
    • 3.2 Makefile文件
    • 3.3 make指令
    • 3.4 .PHONY伪目标
  • 4. sudo提权
    • 4.1 sudo使用
    • 4.2 sudo配置

1. Linux编译器gcc/g++使用

下面以gcc为例来进行讲解,学会了gccg++也自然不在话下,这两个编译器的选项都是通用的,上手比较简单

1.1 目标文件

将代码编译链接生成可执行程序,默认生成可执行文件a.out

gcc/g++ 源文件

当然也可以通过-o选项,来生成指定的可执行文件

-o 目标文件:生成指定目标文件

gcc/g++ -o 目标文件 源文件
gcc/g++ 源文件 -o 目标文件

注意:-o选项后必须跟要生成的目标文件,这个选项放在源文件前面或者后面都是可以的

1.2 预处理

在之前说到过,程序的翻译分为:预处理、编译、汇编、链接四个阶段,下面我们就通过gcc的学习来具体看看每个阶段都做了些什么

首先是预处理,主要功能包括包括宏定义,文件包含,条件编译,去注释等,经过预处理后文件的后缀为.i

通过-E选项,可以使编译器在执行完预处理后停下来,配合-o生成指定文件

gcc/g++ -E 源文件 -o 目标文件(.i)

1.3 编译

第二步是编译,在这个阶段gcc/g++会对代码进行语法分析、词法分析、语义分析、符号汇总等,然后将合法的代码转为汇编代码,经过编译后文件的后缀为.s

通过-S选项,可以使编译器在执行完编译后就停下来,配合-o生成指定文件

-S 源文件 -o 目标文件(.s)  //也可以直接从.i文件开始执行

1.4 汇编

第三步是汇编,这个阶段是将汇编代码转化为二进制,并生成符号表,也就是把编译阶段生成的.s文件转成目标文件,经过汇编后的文件后缀为.o

符号表相当于每个函数独自的地址,在Linux 中,C语言的符号表通常是 _函数名,如 _Add ,C++的符号表通常为 _Z函数名长度+函数名+参数1+参数2

通过 -c 选项,可以使 编译器在执行完汇编阶段后就停下来,配合-o生成指定文件

gcc/g++ -c 源文件 -o 目标文件(.o)  //也可以从.i/.s文件开始执行

二进制文件是elf格式,用vim直接查看是乱码,可以用readelf工具查看,没有的可以自行下载

1.5 链接

最后一步是链接,这个阶段会进行合并段表,符号表的合并和重定位等操作,会将程序运行所需的各种函数链接起来,包括与库函数的链接,Linux 中一般是动态链接,链接后生成可执行文件,默认为a.out,也可以自己指定

gcc/g++ 源文件 -o 目标文件  //也可以从.i/.s/.c文件开始执行

以上就是gcc/g++的全部讲解和操作了,希望对各位有帮助

2. 库

每种编程语言都有自己的库,比如c语言的stdiostdlib等,我们在调用库函数时,就是在调用标准库中的函数,Linux下C语言的标准库都在/usr/include路径下,这个文件就是C语言的动态库

2.1 动态库

动态库中的内容是被所有程序共享的,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件

Linux中默认使用动态链接,通过指令ldd可以列出一个程序所需要的动态链接库(动态链接库也称共享链接库)

ldd 文件名  //查看文件链接情况

这里libc.so.6就是动态链接的标志,其中lib是前缀,.so是后缀,去掉前后缀,最终为c,即为文件最终调用的库

file命令查看文件详细信息

file 文件名  //查看文件的详细信息

动态链接主要依赖不同函数在库中的位置信息进行调用,只有一份代码库,比较节省空间

举个生活中的例子帮助记忆:

  • 动态库就好像是网咖,全村的人都可以去网咖上网,还可以选择自己喜欢的机位和配置

2.2 静态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a,如果想采用 静态链接的方式编译程序,需要在编译时加上 -static 选项”

没有静态库可以自行下载

yum install -y glibc-static  //下载C语言静态库
yum install -y glibc-static libstdc++-static  //下载c++语言静态库

静态库名称为libXXX.a,其中lib是前缀,.a是后缀,去掉前后缀,就是最终调用的库

由于静态链接是直接讲所需代码拷贝到程序中,所以最终生成的文件相对动态链接会大很多

接着上面的例子:

  • 静态库就像是你觉得村里的网吧太远了,自己买了一台电脑放到家里玩(调用某个库),不过如果买了很多台,家里就没地方放了(空间不足)

总结

  • 库分为动态库和静态库,静态库让编译器对用户程序进行静态链接,动态库让编译器对用户程序进行动态链接
  • 静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中的所需要的实现功能的代码到自己的可执行程序中
  • 动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中的所需要的实现功能的代码的地址到自己的可执行程序中。
  • 静态链接成功:程序不依赖任何库,可以独立运行
  • 动态链接成功:程序依赖动态库,一旦动态库缺失,程序无法运行。一般的云服务器,默认的只有动态库

优缺点

动态库优点

  • 可以实现不同进程间的资源共享
  • 因为自身拷贝地址,相比静态库节省很大空间
  • 不调用函数时可以不加载动态库

动态库缺点

  • 需要调用函数,加载速度较慢
  • 程序依赖动态库,一旦动态库缺失,程序无法运行

静态库优点

  • 所需函数直接拷贝至程序中,运行速度快
  • 程序不依赖任何库,可以独立运

静态库缺点

  • 因为自身拷贝实现功能代码问题,浪费空间

3. 自动化构建工具make/Makefile

3.1 概念引入

  • makefile带来的好处就是—“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

3.2 Makefile文件

make命令和Makefike文件是配合使用的,Makefile文件中用来编写任务,任务由依赖关系 + 依赖方法组成

那么什么是依赖关系和依赖方法呢?

比如源文件myfile.c,通过gcc test.c -o myfile命令编译后生成mytfile文件,此时两个文件之间的依赖关系为 myfile:myfile.c ,而依赖方法就是 gcc myfile.c -o myfile

然后将依赖关系和依赖方法写入Makefile文件中

编写完成后,我们就得到了一个基本的自动化任务,输入 make myfile 就可以直接编译 myfile.c 文件,生成 myfile

注意:任务刷新策略

  • 同一个自动化任务,执行成功后,如果相关文件最近没有发生改变,那么无法再次执行该任务
  • 想要再次执行任务,需要对源文件做出修改,或者直接 touch 源文件就行了,两种行为都会修改文件的最近修改时间,使源目标文件不是最新时间

3.3 make指令

直接输入 make 指令时,会默认执行 Makefile 中的第一个自动化任务,当任务成功执行后,不再继续执行后续任务

而使用make 任务名,则可以调用Makefile文件中的任意任务,这里的任务名就是依赖关系中:左侧的名字

3.4 .PHONY伪目标

.PHONYMakefile 文件中的一个关键字,用于对某对象生成伪目标,这样可以无视任务刷新策略,重复执行任务

.PHONY 关键字,对于源文件编译来说,没什么意义,一般是用来修饰 clean 任务,生成清理任务,实现如下

小知识:make 指令的工作原理是去 Makefile 文件中查找任务执行,设计者为了保证适用性,命名为Makefilemakefile都是可以的

4. sudo提权

4.1 sudo使用

当普通用户想去执行某些操作时,会提示权限不够,需要使用root身份,比如一个简单的下载软件操作,就有些麻烦了,为了解决这一情况,可以使用sudo进行提权,也就是暂时借助root的身份去完成某个命令

sudo 命令

当遇到权限拒绝的场景时,只需要使用sudo 命令 ,然后输入密码,就可以暂时root的身份无视权限完成指令了,这里不需要输入root密码,而是输入普通用户的密码,这样可以做到保护root的情况下执行指令

4.2 sudo配置

普通用户默认是没有赋予提权权限的,还是需要切到root用户下进行配置

配置步骤:

  1. 切换到root用户下
  2. 打开/etc/sudoers文件
  3. 翻到最下面,找到指定区域,将需要提权的用户添加进去
//root用户下
vim /etc/sudoers  //进入配置文件,按照下图修改即可


退出底行模式的时候需要使用wq!指令,这是因为是系统级配置文件所以修改需要慎重,所以必须强制修改


Linux开发工具gcc/g++,到这里就介绍结束了,本篇文章对你由帮助的话,期待大佬们的三连,你们的支持是我最大的动力!

文章有写的不足或是错误的地方,欢迎评论或私信指出,我会在第一时间改正

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

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

相关文章

RabbitMQ系列(29)--RabbitMQ搭建Shovel

前言: Federation具备的数据转发功能类似,Shovel能够可靠、持续地从一个Broker中的队列(作为源端,即source)拉取数据并转发至另一个Broker中的交换器(作为目的端,即destination)。作为源端的队列和作为目的端的交换器可以同时位于…

SGM58031与单片机驱动实现

SGM58031与单片机驱动实现 文章目录 SGM58031与单片机驱动实现CUBEIDE设置I2C通讯封装SGM58031通讯实现 CUBEIDE设置 使用硬件I2C与sgm芯片通讯,上面即配置硬件I2C,其他参数默认即可。 I2C通讯封装 封装实现 /*** brief Manages error callback by re-initializ…

【JVM调优】JVM调优工具之Arthas

Arthas的作用 Arthas是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时&#x…

【Elasticsearch】索引库操作

目录 2.索引库操作 2.1.mapping映射属性 2.2.索引库的CRUD 2.2.1.创建索引库和映射 基本语法: 示例: 2.2.2.查询索引库 2.2.3.修改索引库 2.2.4.删除索引库 2.2.5.总结 2.索引库操作 索引库就类似数据库表,mapping映射就类似表的…

[神经网络]Anchor_Free网络(YoloX,CenterNet)

Anchor_Free网络不同于传统的目标检测网络需要先生成很多先验框再从中筛选回归生成预测框。其可以直接从目标的中心点向周围发散一个预测框。这样做有两个好处:①省略了生成大量先验框的过程,可以一定程度增加预测速度;②预测框没有预设长宽比…

魅族新专利:弹开机构及折叠终端,提高便捷性、降低使用难度

珠海市魅族科技有限公司透露新专利:弹开机构及折叠终端,提高展开便捷性、降低使用难度! 该专利介绍了一种用于电子设备的弹开机构和折叠终端。该弹开机构由磁吸组和弹开模组组成。磁吸组包括第一磁吸件和第二磁吸件,其中第一磁吸件…

SpringBoot 如何使用 TestRestTemplate 进行 RESTful API 集成测试

SpringBoot 如何使用 TestRestTemplate 进行 RESTful API 集成测试 在使用 SpringBoot 开发 RESTful API 的过程中,我们需要进行集成测试,以确保 API 的正确性和可用性。而 TestRestTemplate 是 Spring Framework 提供的一个工具类,可以用来…

Flink实时任务性能调优

前言 通常我们在开发完Flink任务提交运行后,需要对任务的参数进行一些调整,通常需要调整的情况是任务消费速度跟不上数据写入速度,从而导致实时任务出现反压、内存GC频繁(FullGC)频繁、内存溢出导致TaskManager被Kill…

【笔记】数字电路基础1 - 门电路

目录 数字电路基础与门电路数电基础基本门电路复合门电路TTL 门电路CMOS 门电路 数字电路基础与门电路 数电基础 数字电路中常将 0 ~ 1V 范围的电压称为低电平,用“0”表示;而将 3 ~ 5V 范围的电压称为高电平,用“1”…

【InnoDB 存储引擎】InnoDB 存储引擎的行格式,有 Compact、Redundant、Dynamic 等行格式还有它们配套实验(理论篇)

文章目录 1 InnoDB 行记录格式(理论)1.1 Redundant 行记录格式1.2 Compact 行记录格式(重点)1.3 行溢出数据1.4 Compressed 和 Dynamic 行记录格式1.5 CHAR 的行结构存储 2 参考资料 1 InnoDB 行记录格式(理论&#xf…

什么是数据一致性

什么是数据一致性 数据一致性这个单词在平常开发中,或者各种文章中都能经常看见,我们常常听见什么东西数据不一致了,造成了一定的损失,赶快修复一下。但是很多同学对一致性具体代表什么意思,他有什么作用依然不是很了解…

车载软件架构 —— 闲聊几句AUTOSAR OS(八)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

Overleaf 集成git出现authentification failed 的解决方法

Overleaf 集成git遇到的问题和解决办法 需求背景:使用git 将overleaf 项目克隆到本地硬盘上工作,像写代码一样管理论文版本。 问题描述:直接使用overleaf提供的git clone xxxx 会出现authentication failed for xxxxx (见下图) …

C++中的继承/虚继承原理

C中的继承 文章目录 C中的继承1.继承的概念和定义1.1 继承定义1.12 继承关系和访问限定符2.基类和派生类对象的复制转换3.继承中的作用域4.派生类的默认成员函数继承与友元 6.**继承与静态成员****复杂的菱形继承及菱形虚拟继承**7.虚继承解决数据冗余和二义性的原理 1.继承的概…

git 技术点整理

1.git安装 1.1官网下载 Git 安装详情见https://www.cnblogs.com/liuwenwu9527/p/11688323.html 1.2配置 2.git基本概念 2.1本地 工作区(Working Directory):就是你在电脑里能看到的目录。说人话就是idea直接能看到的这部分纯代码区域。(不含 .git…

基于51单片机的太阳追光系统设计

本实例是基于51单片机的太阳追光系统,主要硬件由51单片机最小系统,四路光敏感应电路,ADC0832转换电路、LED指示灯电路、X轴与Y轴步进电机构成。 设计功能 1.四路光敏感应电路:四路光敏电阻分别感应上、下、左、右四个方向的光强…

两组表单看懂MySQL的多表查询

第一组表单信息 1、查询每个部门的所属员工 mysql> SELECT name,GROUP_CONCAT(ename) persons-> FROM dept3 d-> LEFT JOIN emp3 e-> ON d.deptno e.dept_id-> GROUP BY d.deptno-> UNION -> SELECT name,GROUP_CONCAT(ename) persons-> FROM dept3 …

代码随想录算法训练营第六十天| 84.柱状图中最大的矩形

柱状图中最大的矩形 题目链接: 力扣 假设以柱子1(指值为1的柱子)为基准,柱子1的左侧没有比柱子1矮的元素,所以柱子1可以无限像左边扩展,柱子1的右侧也没有比柱子1矮的元素,所以柱子1可以无限向…

用OpenCV进行图像分割--进阶篇

1. 引言 大家好,我的图像处理爱好者们! 在上一篇幅中,我们简单介绍了图像分割领域中的基础知识,包含基于固定阈值的分割和基于OSTU的分割算法。这一次,我们将通过介绍基于色度的分割来进一步巩固大家的基础知识。 闲…