【Linux】Linux编译器gcc/g++的使用

news2024/11/16 15:27:08

今天不学习,明天变垃圾。

在这里插入图片描述

文章目录

  • 一、程序的翻译过程
    • 1.预处理(1.2.3把你的代码编译成二进制代码)
    • 2.编译(C语言 ==> 汇编语言)
    • 3.汇编(无法被执行的二进制文件,为什么捏?)
    • 4.链接(你写的代码 + C标准库的二进制代码 ==> 生成可执行的二进制程序)
  • 二、库函数调用的地方怎么与标准库关联起来的?
    • 1.静态链接
    • 2.动态链接
    • 3.gcc、g++、vs等默认形成的可执行程序,采用的都是动态链接
    • 4.系统本身为了支持我们编程,给我们提供了什么呢?



一、程序的翻译过程

1.预处理(1.2.3把你的代码编译成二进制代码)

头文件拷贝,去注释,条件编译,宏替换
-E让程序翻译到预处理阶段就停下来,-o指明形成的临时文件名称。

gcc test.c -E -o test.i
/usr/include/stdio.h //linux下的头文件路径
C:\Program Files\Microsoft Visual Studio\2022\Community\SDK\ScopeCppSDK\vc15\SDK\include\ucrt\stdio.h
//我的windows下的头文件路径

预处理之后的文件中多出来的一大堆代码其实是从linux中的/usr/include/stdio.h头文件路径下的头文件stdio.h中拷贝过来的,从头文件stdio.h中就可以找到printf函数的声明,具体的实现在C标准函数库里面

在这里插入图片描述

gcc test.c -DSHOW //标识符在命令行中定义

从下面图片便可以看出预处理阶段进行的4个步骤,删除注释,拷贝头文件,条件编译,宏替换
在这里插入图片描述

头文件最大的意义:1.写代码 2.支持代码自动补齐

2.编译(C语言 ==> 汇编语言)

-S进行程序的编译工作,做完编译工作,变成汇编语言之后,就停下来!

gcc -S test.i -o test.s

3.汇编(无法被执行的二进制文件,为什么捏?)

-c进行程序的汇编工作,做完汇编工作,变成可重定向目标二进制文件,就停下来!

gcc -c test.s -o test.o
od test.o //将二进制文件以二进制形式打印到显示器上

在这里插入图片描述

./test.o //运行二进制文件

可以看到我们无法执行这个二进制文件,其实是因为我们的文件中的一些库函数还没有成功的调用,现在仅仅只有这些库函数的声明,这些声明就在拷贝的头文件里面,而库函数的实现在标准库里面,链接阶段会帮助我们将标准库动态链接到我们的程序里面,之后程序才可以正常的运行。
在这里插入图片描述

最后,为了方便大家记忆指令的选项和生成的文件后缀名,这里教一下大家如何去记,ESc正好就是退出键,iso是镜像文件的后缀名

4.链接(你写的代码 + C标准库的二进制代码 ==> 生成可执行的二进制程序)

下面指令就是将我们汇编后的可重定向目标二进制文件进行链接,并且将链接过后的文件指明为mytest文件名

gcc test.o -o mytest

二、库函数调用的地方怎么与标准库关联起来的?

a.链接的本质:无非就是我们在调用库函数的时候,与标准库如何关联的这么一个问题!
b.关联的方式有两种:动态链接和静态链接

1.静态链接

链接的时候,不是与标准库产生关联,而是将程序内部要用的方法,给程序拷贝一份,这样就完成了静态链接。

优势:不受库升级或者被删除的影响,这里当然指的是形成可执行二进制程序之后不受删除的影响,如果形成之前被删除的话,拷贝也拷贝不了了。
劣势:形成的可执行程序体积太大,网络、磁盘、内存的资源占用量大,

2.动态链接

通过编译器内部的链接器,来链接标准函数库,值得注意的是,动态链接的时期是在程序运行的时候,如果程序需要链接,链接器就会链接标准函数库

优势:动态链接形成的可执行程序小,在内存、磁盘、网络等方面可以节省资源,与静态链接相比,这是决定性的优势。

3.gcc、g++、vs等默认形成的可执行程序,采用的都是动态链接

file mytest // 查看可执行程序的详细信息
ldd mytest // 查看可执行程序依赖的动态库列表

在linux下库的命名:
动态库:lib作为前缀,.so作为后缀,
静态库:lib作为前缀,.a作为后缀,
去掉前缀和后缀,剩下的就是库名称!
stdio的std就是standard标准的意思

在这里插入图片描述

用这个库的程序非常多,但是库只有一份,所有用C语言写的程序,就不会出现重复的库代码,所以如果以后我们要下载一个C程序,还用下载C标准库吗?答案是不用的,因为我们系统里边只要有一份库就够使用了,但如果是静态链接的C程序的话,情况就不一样了,一下载就内存占用超大。

动态库默认系统里就有,静态库不一定有
静态链接,拷贝的是.a静态库的代码,所以如果想要实现静态链接,系统里就必须存在.a结尾的静态库

一般而言,为什么系统会自动携带动态库?因为光系统程序运行就需要动态库
在这里插入图片描述

sudo yum install glibc-static -y // 下载c标准静态库
sudo yum install -y libstdc++-static // 下载C++标准静态库
gcc mytest.c -o mytest -static // gcc实现静态链接
g++ mytest.c -o mytest -static // g++实现静态链接

4.系统本身为了支持我们编程,给我们提供了什么呢?

系统给我们提供标准库的.h文件,这些.h文件里面有方法,它可以告诉我们怎么用这些库函数。
系统还给我们提供了动静态标准库.so/.a,这里面有方法的实现,也就是一些已经写好的二进制代码,但我们需要将我们的代码和库代码进行链接,才可以正常使用。

windows下动态库后缀为.dll静态库后缀为.lib

在这里插入图片描述

在安装vs2022时,我们安装的不仅仅是编译器本身,还要安装标准库的.h文件,以及标准动静态库等

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

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

相关文章

腾讯云Windows 轻量应用服务器如何搭建 FTP 服务?

本文档介绍如何在 Windows 操作系统的轻量应用服务器上通过 IIS 搭建 FTP 站点。 本文搭建 FTP 服务组成版本如下: Windows 操作系统,本文以系统镜像 Windows Server 2012 为例。IIS:Web 服务器,本文以 IIS 8.5 为例。 步骤1&am…

自行车在线租赁管理系统的设计与实现

自行车在线租赁管理系统 摘 要 随着Internet的不断发展,在线租赁在现实生活中的使用和普及,自行车在线租赁行业成为近年内出现的一个新行业,并且能够成为大众广为认可和接受的行为和选择。设计自行车在线租赁管理系统的目的就是借助计算机…

(四)汇编语言——简单程序

目录 编写程序的工作过程 编写汇编源程序 伪指令 汇编指令 注释 编写步骤 编译连接 编译 连接 运行 总结 编写程序的工作过程 接下来,我们简单介绍一下一个汇编程序,从写出到最后执行,他到底经历了哪些步骤。 编写汇编源程序 首先…

vue3 antd项目实战——修改table表格的默认样式(一)调整table表格每行(row)行高过高问题

vue3 antd项目实战——修改ant design vue table组件的默认样式(调整每行行高)知识调用场景复现实际操作解决a-table表格padding过宽知识调用 文章中可能会用到的知识链接vue3ant design vuets实战【ant-design-vue组件库引入】css样式穿透(…

node.js+uni计算机毕设项目基于微信小程序的房屋交易平台(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等…

智能超表面(RIS)辅助双功能雷达和通信波束形成设计(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 智能超表面,也叫做“可重配智能表面”,或者“智能反射表面”,英文为RIS(Reconf…

springboot消息

发送短信的简单原理 activemq 5.17 版本的 需要java11 环境 mq 网页版本控制台 账号密码为admin 指定发送的名 即上图的默认名为itheima 监听器 自动监听消息 接受 如果接受到消息 还想再其他地方使用 可以使用sendto 使用管理员权限 登录 然后列出插件 安装插件 r…

Java 注解 自定义注解 注解的解析

目录 一、认识Java自带注解 二、自定义注解 1、认识元注解 2、自定义注解 3、注解的使用 4、反射解析注解 一、认识Java自带注解 jdk中自带了一些注解,如下四个: Override类方法的的重写注解Deprecated类或方法被废除的注解FunctionalInterface函…

数据结构---串

(一)串的基本概念 串(string或字符串)是由零个或多个字符组成的有限序列,一般记为:s′a1a2…a′n(n≥0) 其中,s是串的名称,用单括号括起来的字符序列是串的值; ai(1≤i≤n)ai(1≤i…

CSS优先级CSS盒子模型

1、CSS继承 文字相关的样式可以被继承【作用在父元素上面,子元素可以继承】布局相关的样式不可以被继承【可以通过inherit值进行继承】 2、CSS优先级 书写了相同样式时,后写的样式优先级较高当内部样式和外部样式有相同的样式时,后写的样式…

操作符(8)

目录 1、算术操作符 2、移位操作符 3、位操作符 1、不能创建临时变量(第三个变量),实现两个数的交换 4、赋值操作符 5、单目操作符 6、关系操作符 7、逻辑操作符 8、条件操作符 9、逗号表达式 10、下标引用、函数调用和结构成员 …

WPF开发之Prism详解【内附源码】

在实际应用开发中,随着项目业务逐渐复杂,耦合度会越来越高,维护成本也会直线上升,所以解耦也变得越来越重要。Prism框架为WPF开发中解耦提供了非常便捷的应用。今天主要以一个简单的小例子,简述WPF开发中Prism框架的简…

基于Arch Linux的SystemRescue 9.06工具包新特性

导读在上次发布两个月后,SystemRescue(原名SystemRescueCd)Linux系统救援工具包今天更新到了9.06版本,这个版本在启动菜单中增加了新的选项,更新了组件和新工具。 SystemRescue 9.06在这里采用了最新、最棒的Xfce 4.18…

【三年面试五年模拟】算法工程师的独孤九剑秘籍(第十一式)

Rocky Ding公众号:WeThinkIn写在前面 【三年面试五年模拟】栏目专注于分享CV算法与机器学习相关的经典&&必备&&高价值的面试知识点,并向着更实战,更真实,更从容的方向不断优化迭代。也欢迎大家提出宝贵的意见或优…

我是真没想道,这个面试题居然从11年前就开始讨论了,而官方今年才表态。

大家好 这期给大家盘一个面试题啊,就是下面的第二题。 这个面试题的图片都被弄的有一点“包浆”了。 所以为了你的观感,我还是把第二道题目手打一遍。 啧啧啧,这行为,暖男作者实锤了: spring 在启动期间会做类扫描&…

前端css样式小知识点(2)

文章目录前言图文实操讲解1、微信小程序之页面跳转方法页面跳转有很多种方式,先简单说一下它们的区别吧简单实现2、微信小程序this.setData修改对象、数组中的值3、微信小程序-获取input值的方法4、微信小程序-常用的三种弹窗5、dataset 简单小知识 误区6、that.set…

git status查看本地库状态、git add添加暂存区

假设目前我处于我的项目之下。 查看状态命令 git status 可以看到如下的状态 现在我新建一个文件hello.txt 在里面写了16行的内容。(这个vim之前也没有使用过,在最后记录一下。) 再看一下状态 那我们现在就add一下,使用命令&…

新冠确诊阳性的第六篇博客,Linux防火墙管理

Linux防火墙管理1.防火墙的下载2.演示:关闭防火墙3.防火墙端口管理4.防火墙的其他命令1.防火墙的下载 Centos7下默认的防火墙是 Firewall 如果提示:Unit firewalld.service could not be found. 说明防火墙没有安装,需要安装 sudo yum ins…

redux及react-redux

redux 这篇文章谈一谈仓库redux。 首先,学习任何东西都离不开官网。在此附上官网网址 Redux - A predictable state container for JavaScript apps. | Redux 1.什么是redux? 从如下几个方面: redux在一个项目中可集中管理状态(数据)和逻…

【Pandas入门教程】如何操作文本数据

如何操作文本数据 来源:Pandas官网:https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html 笔记托管:https://gitee.com/DingJiaxiong/machine-learning-study 文章目录如何操作文本数据导包数据准备【小结】导包 imp…