[Linux开发工具]——gcc/g++的使用

Linux编译器——gcc/g++的使用

  • 一、快速认识gcc/g++
  • 二、程序的翻译过程
    • 2.1 预处理(.i文件)
    • 2.2 编译(.s文件)
    • 2.3 汇编(.o文件)
    • 2.4 链接(生成可执行文件或库文件)
  • 三、认识函数库
    • 3.1 静态库
    • 3.2 动态库库
    • 3.3 .dll(windows的动态库)缺失问题
    • 3.4 动静态库总结

一、快速认识gcc/g++

编译生成可执行程序的方法:
在这里插入图片描述
可以形成一个指定名称的可执行程序有两种方法:
在这里插入图片描述
C语言源程序即可以用gcc编译也可以用g++编译,方法都是一样得。
C++源程序只能用**g++**编译器进行编译。(用gcc编译会报错)

二、程序的翻译过程

为什么c生万物?
早期语言是二进制,发展成汇编语言(划时代的东西,操作系统和编译器等诞生),丹尼斯里奇设计了更方便的语言(c语言),后来出现的面向对象语言c++,Python等编译器都是C语言写得,java的虚拟机是c++写得,所以c生万物。
先有语言还是先有编译器?
先有语言在有编译器,这个语言比编译器要出现的早一下(用二进制写得汇编编译器)。
如图:
语言的自举过程
在这里插入图片描述
总结:
c->低级语言写一个c编译器->能形成软件
c编译器->c->低级语言写一个c编译器->形成了用c写的编译器
c->用c写的编译器->编译c语言
c编译器优化v2->用c写的编译器v1->v2编译器

2.1 预处理(.i文件)

预处理功能 主要包括宏替换,头文件包含展开(所谓的头文件展开,本质是在预处理的时候,将头文件的内容拷贝至源文件),条件编译,去注释等。
预处理指令是以 # 号开头的代码行 。
#防止头文件被重复包含,为什么?
通过条件编译,将重复的编译进行去掉 。(命令行定义:gcc hello.c -o hello.exe -D VERSIONI=1)

gcc -E hello.c -o hello.i// 从现在开始进行程序的翻译过程,当预处理做完的时候,就停下来。

在这里插入图片描述

选项 “-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件(object)。
“.i”文件为已经过预处理的C原始程序。

2.2 编译(.s文件)

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。

gcc -S hello.i -o hello.s //从现在开始进行程序的翻译过程,当编译工作做完,就停下来。

在这里插入图片描述

“-S” 选项进行查看,该选项只进行编译而不进行汇编,只生成汇编代码,并生成.s 文件 。

2.3 汇编(.o文件)

汇编阶段是把编译阶段生成的 “.s”文件 转成 目标文件 “-o”

gcc -c hello.s -o hello.o //从现在开始进行程序的翻译过程,当汇编工作做完,就停下来。

在这里插入图片描述

选项 “-c” 可看到汇编代码已转化为 “.o”的二进制目标代码
此时的形成的Linux下的 .o 二进制文件相当于windows下的 .obj可重定位目标二进制文件,是不可执行程序,因为还差一步链接的过程。

2.4 链接(生成可执行文件或库文件)

在成功汇编之后,就进入了链接阶段 。自己编写的代码也被打包成.o文件,库文件也是被打包成.o文件,最后将他们这两个.o文件进行链接。

gcc hello.o -o hello //自己编写的代码被打包成.o文件,库文件也被打包成.o文件,最后将他们这两个.o文件进行链接。

在这里插入图片描述

三、认识函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

答案是:系统把这些函数实现都被列到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。

在这里插入图片描述
查看Linux下的头文件:

ls /usr/include/

在这里插入图片描述

库的区分:
在这里插入图片描述

3.1 静态库

静态库是指编译链接时,把库文件的代码全部加入拷贝到可执行文件中 ,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名 一般为 “.a”。

3.2 动态库库

与静态库相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时,运行链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so” ,如前面所述的 libc.so.6 就是动态库 。

3.3 .dll(windows的动态库)缺失问题

被多个使用者共享使用,一旦缺失,所有程序都不可以运行了!!
在这里插入图片描述

.dll(windows的动态库)缺失的可能场景:
1.在链接的时候,病毒对你的代码进行了修改(病毒:对库进行恶意替换),当链接时对应的库文件.dll进行链接时,可执行程序就可以跑起来了,就可以对你的文件进行任意的修改了 。
2.杀毒扫描的是:系统之中可能隐藏的可执行程序 以及 各种静态库 。可能是在扫描过程中,扫描软件可能本身就存在各种bug,扫描的时候将你的库文件搞没了也是有可能的。

3.4 动静态库总结

1.函数库
函数库一般分为静态库动态库两种。
动静态库本质就是文件,头文件也是文件 。
2.动静态库优缺点
动态库:(动态链接)
优比较节省资源,不会出现太多的重复代码----资源磁盘,内存,网络等资源。
缺点:对库的依赖性比较强----旦库丢失,所有使用这个库的程序都无法运行。
静态库:(静态链接)
优:不依赖库,同类型平台中都可以直接运行使用。
缺点:可执行程序体积比较大,比较浪费资源----资源磁盘,内存,网络等资源
3.生成动静态库的命令

gcc -o myfile myfile.c //生成动态的文件,动态链接1
gcc -o myfile-static myfile.c -static //生成静态的文件,静态链接2

注意:如果linux里没有安装c/c++静态库, 进行2号操作会报错,这时候我们就要安装c/c++静态库。
安装静态库命令:

yum install -y glibc-static libstdc++ -static

查看是否安装:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一大波新型勒索病毒来袭(更新)

目前勒索病毒仍然是全球最大的威胁,最近一年针对企业的勒索病毒攻击越来越多,大部分勒索病毒是无法解密的,一定要保持高度的重视,近期又有一大波新型勒索病毒来袭...... HildaCrypt勒索病毒 加密后的文件后缀名HCY,如…

qt 置顶窗口崩溃无法退出解决,停止运行快捷键设置

有时置顶窗口调试崩溃需要快捷键进行关闭,如下设置即可 这样就可以通过全局快捷键退出了,避免置顶崩溃无法关闭程序的问题。

《系统架构设计师教程(第2版)》第7章-系统架构设计基础知识-02-基于架构的软件开发方法

文章目录 1. 基于架构的软件设计(ABSD)1.1 概述1.2 ABSD方法的3个基础 2. 概念与术语2.1 设计元素2.2 视角与视图2.3 用例和质量场景 3. ABSD模型4. 体系结构需求4.1 需求获取4.2 标识构件4.3 架构需求评审 5. 体系结构设计5.1 体系结构设计5.2 软件体系…

8 克隆虚拟机

后期集群我们需要使用多台服务器,此处我们先克隆三台,master,slave01,slave02. 1.先关闭模版虚拟机。再选择 模版虚拟机hadoop100右击--》管理 --》克隆 2.下图中特别注意:建议使用集群的名字作为虚拟机名称。目前克隆主机master. 以上步骤完…

Django数据库查询

聚合查询 分组查询 F与Q查询 默认情况下,用Q包裹的两个条件,用逗号分割也是and关系 choices参数 只要某个字段的可能性是完全可以列举出来的,可以采取choices参数 该gender字段存的还是数字,但是如果数字在上面的元组列举范围内,该怎么获取对应的值,如果不在范围内,会怎…

Java学习笔记(20)

可变参数 输入的参数数量不确定 底层就是把输入的参数放进一个数组里 只能写一个可变参数如果还有其他形参,可变参数要放在最后写 可变参数在底层就是一个数组 Collections Addall shuffle 练习 package exercise;import java.util.ArrayList; import java.util.C…

Nacos详解,从安装到服务部署,及nginx反向代理

Nacos 安装 Windows安装 下载 在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码: GitHub主页:https://github.com/alibaba/nacos GitHub的Release下载页:https://github.com/alibaba/nacos…

更新数据库表中的数据

目录 update 加上各种限制条件 update update 表名set 列名1xx,列名2xx 指定更新某列数据如果不添加where子句,则为全列更新 也可以在原有基础上更新: 注意,mysql语法里不支持,必须是列名列名数值 加上各种限制条件 比如加上order by子句,where子句,limit等 这些条件对于up…

Flutter 运行 flutter doctor 命令长时间未响应

由于 Flutter 运行 flutter doctor 命令,会从 pub(https://pub.dev/ 类似于 Node.js 的 npm) 上进行资源的下载,如果没有配置国内镜像,可能会由于其服务器在国外导致资源下载慢或者下载不下来,所以出现了运行 flutter doctor 命令…

权限提升-Web权限提升篇划分获取资产服务后台系统数据库管理相互转移

知识点 1、权限提升转移-分类&高低&场景 2、Web权限提升及转移-后台&数据库 3、后台权限及转移-转移对象&后台分类 章节点: 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 0、为什么我们要学…

算法复杂度的介绍

算法复杂度简介 复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来分析算法执行效率与数据规模之间的增长关系,可以粗略地表示,越高阶复杂度的算法,执行效率越低。常见的复杂度并不多,从低阶到高阶有…

API(时间类)

一、Date类 java.util.Date类 表示特定的瞬间,精确到毫秒。 Date常用方法: public long getTime() 把日期对象转换成对应的时间毫秒值。 public void setTime(long time) 把方法参数给定的毫秒值设…

使用布丰投针法精确计算圆周率

如果在平面上有两条距离为d的平行线,假设如果拿一根长度是L的铁针随机的丢到纸面上去,那么试问铁针与某条直线所相交的概率是多少,假设铁针的长度L是大于平行线的距离d的,这样铁针就不会同时与两条直线所相交了。 添加图片注释&am…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《基于老化成本实时次梯度的异构储能系统功率分配策略》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

如何进行软件测试

1、测试用例带给我们的好处 (1)测试执行者的依据 (2)使得工作可重复,自动化测试的基础 (3)评估需求覆盖率 (4)用例的复用 (5)积累测试的方法思…

零代码编程:用kimichat将srt字幕文件进行批量转换合并

文件夹里面有多个srt字幕文件,借助kimichat可以很方便的对其进行批量合并。 在kimichat中输入提示词: 你是一个Python编程专家,写一个Python脚本,完成一个处理整理文档内容的任务,具体步骤如下: 打开文件…

Microsoft Copilot (Bing Chat)

Copilot: Your everyday AI companion (你每天的AI伙伴) Bing AI - 搜索 Microsoft Copilot: 你的日常 AI 助手 Copilot|Designer: Create images from words with AI https://www.bing.com/images/create 2024 年 1 月 23 日更新: 在微软…

软考高级:软件架构评估-质量属性概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

【Winform学习笔记(十一)】解决无边框窗体最大化显示异常问题

解决无边框窗体最大化显示异常问题 前言正文1、防止改变窗口大小时控件闪烁2、FrmMain_SizeChanged 前言 Winform 无边框窗体的设计,旨在为用户提供更加独特和个性化的界面体验,但是在实现这一设计的过程中,最大化显示异常问题往往成为开发者…

日志集中审计系列(1)--- LogAuditor接收DAS设备syslog日志

日志集中审计系列(1)--- LogAuditor接收DAS设备syslog日志 前言拓扑图设备选型组网需求配置思路操作步骤结果验证前言 近期有读者留言:“因华为数通模拟器仅能支持USG6000V的防火墙,无法支持别的安全产品,导致很多网络安全的方案和产品功能无法模拟练习,是否有真机操作的…