[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

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

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

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

相关文章

微调alpaca-lora遇到的一些问题

1、环境简介 环境: 系统:Ubuntu torch:2.2.1 python:3.10 gpu:V100 16g peft:0.9.0 使用PEFT中的lora方式微调llama-2-7b-hf,项目地址:alpaca-lora 2、混合精度训练Tensor相互计算会…

Jupyter Notebook介绍、安装及使用教程

Jupyter Notebook介绍、安装及使用教程 一、什么是Jupyter Notebook?简介组成部分网页应用文档Jupyter Notebook的主要特点 二、安装Jupyter Notebook先试用,再决定安装安装前提使用Anaconda安装使用pip命令安装 三、运行Jupyter Notebook帮助启动默认端…

macOS 通过 MacPorts 正确安装 MySQL 同时解决无法连接问题

如果你通过 sudo port install 命令正常安装了 MySQL,再通过 sudo port load 命令启动了 MySQL Server,此刻却发现使用 Navicat 之类的 GUI 软件无法连接,始终返回无法连接到 127.0.0.1 服务器。这是一个小坑,因为他默认使用了 So…

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

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

更新数据库表中的数据

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

【FLOOD FILL专题】【蓝桥杯备考训练】:扫雷、动态网格、走迷宫、画图、山峰和山谷【已更新完成】

目录 1、扫雷(Google Kickstart2014 Round C Problem A) 2、动态网格(Google Kickstart2015 Round D Problem A) 3、走迷宫(模板) 4、画图(第六次CCF计算机软件能力认证) 5、山…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(四)—— 过拟合和欠拟合

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 通过增加容量或提前停止来提高性能。 在深度学习中&#…

C#对于文件中的文件名判断问题

C#中对于文件名的判断问题,我们使用bool值进行值的传递,首先我们使用内置方法进行文件字符串匹配的bool值回传,我们打印出文件名以及相对应的bool,即可知道文件名是否真正生效 bool isHave fileName.Contains("Hello"…

代码学习记录22--回溯算法第三天

随想录日记part22 t i m e : time: time: 2024.03.17 主要内容:今天主要是结合类型的题目加深对回溯算法的理解:1.组合总和;2.组合总和 ;3.分割回文串。 39. 组合总和 40.组合总和II131.分割回文串 Topic1组合总和 题…

【Node.js从基础到高级运用】十四、Node.js 错误处理与日志记录

引言 在这篇博客文章中,我们将深入探讨Node.js中的错误处理和日志记录的最佳实践。我们会了解如何在Node.js应用程序中有效地捕获和处理错误,并利用日志库如morgan来记录应用程序的活动和错误信息。 第1部分:Node.js中的错误处理 同步代码中…

Spring AI Embeddings 和 Vector 入门

在前面 Spring AI Chat 简单示例 中介绍了 Chat 的基本用法,本文在此基础(主要是pom.xml)上继续探索 Embedding 和 Vector。 官方文档: embeddings: https://docs.spring.io/spring-ai/reference/api/embeddings/openai-embedding…

断点重训教程:如何有效地保护深度学习模型训练进度

在深度学习领域,长时间训练是常见的需求,然而,在训练过程中可能会面临各种意外情况,比如计算机故障、断电等,这些意外情况可能导致训练过程中断,造成已经投入的时间和资源的浪费。为了应对这种情况&#xf…

Avue框架实现图表的基本知识 | 附Demo(全)

目录 前言1. 柱状图2. 折线图3. 饼图4. 刻度盘6. 仪表盘7. 象形图8. 彩蛋8.1 饼图8.2 柱状图8.3 折线图8.4 温度仪表盘8.5 进度条 前言 以下Demo,作为初学者来说,会相应给出一些代码注释,可相应选择你所想要的款式 对于以下Demo&#xff0c…

GStreamer简单看看

主要是现在弄摄像头,要用到这东西。所以学学。 最权威主页:GStreamer: open source multimedia framework 大概看了下,好像命令也不难。 gst-launch-1.0 v4l2src device/dev/video0 ! video/x-raw,formatYUY2,width640,height480,framerat…

说说你对webpack的理解?解决了什么问题?

文章目录 一、背景二、问题三、是什么参考文献 一、背景 Webpack 最初的目标是实现前端项目的模块化,旨在更高效地管理和维护项目中的每一个资源 模块化 最早的时候,我们会通过文件划分的形式实现模块化,也就是将每个功能及其相关状态数据各…

Batch Normalization(批量归一化)和 Layer Normalization(层归一化)

Batch Normalization(批量归一化)和 Layer Normalization(层归一化)都是深度学习中用于改善网络训练过程的归一化技术。尽管它们的目标相似,即通过规范化中间层的激活值来加速训练过程并提高性能,但它们在细节上有所不同。 Batch Normalization (批量归一化) Batch Nor…

谷歌地图TMS地图服务地址收集2024,测试可用

对于普通的开发者或者GIS从业者来说,免费的底图影像服务,太重要了。之前写过一篇谷歌地图的TMS地址收集的博文,由于谷歌网站关闭已经不能用。最近又发现了谷歌在国内开放了其他地址,在这里给大家分享一下。 https://gac-geo.googl…

Ant Design Vue和VUE3下的upload组件使用以及文件预览

Ant Design Vue和VUE3下的upload组件使用以及文件预览 文章目录 Ant Design Vue和VUE3下的upload组件使用以及文件预览一、多文件上传1.需求2.样例3.代码 二、单文件上传1. 需求2. 样例3.代码 二、多文件上传产生的时间超时问题三、文件系统名称更改1. 修改文件index.html2. 修…

Leetcode热题100:图论

Leetcode 200. 岛屿数量 深度优先搜索法: 对于这道题来说,是一个非常经典的图的问题,我们可以先从宏观上面来看问题,也就是说在不想具体算法的前提下,简单的说出如何找到所有的岛屿呢? 如图中所示&#x…

oracle 19c单机版本补丁升级

文章目录 一、补丁包概述二、备份opatch三、替换高版本opatch四、打DB补丁1、关闭数据库2、关闭监听3、解压补丁4、冲突检测5、补丁空间检查6、执行补丁升级7、将更新内容加载到数据库8、最后查看数据库版本9、卸载补丁包 一、补丁包概述 补丁升级包 链接:https://…