Linux编译器

目录

Linux编译器

程序编译的步骤

gcc编译器完成C语言程序的编译

预处理

编译

汇编

链接


上一期我们学习了Linux中的vim编辑器,其实本质上vim编辑器就是写代码的一个工具。上期内容我们也已经说过,一份合格的代码需要进行编写,编译,调试,运行,运行,发布这几个步骤,上期我们讲述了编写的步骤,本期将为大家讲解编译步骤。

Linux编译器

程序编译的步骤

一个程序要被编译,一般要进行以下几个步骤:预处理,编译,汇编,链接。在linux中,完成C语言程序的编译我们使用gcc编译器进行编译,完成C++程序的编译我们需要使用g++编译器进行编译。

gcc编译器完成C语言程序的编译

预处理

我们先创建一个C语言的源文件test.c,然后对此文件进行各种操作。

在预处理阶段,我们要完成的工作就是要完成头文件的展开,宏替换和去注释。对test.c完成这些操作之后,我们会生成对应的test.i文件,完成这些工作我们需要下述代码:

执行完上述代码之后会生成对应的test.i文件。 

编译

为什么要进行编译?

因为对于编译器而言,它只能识别机器码,所以必须通过编译阶段先将高级的语言程序代码先转为汇编代码,然后再将汇编代码转为编译器可以识别的机器代码即0和1。需要注意的是这个编译和整个源程序的编译不是一个编译,这里的编译是整个源程序编译的一个步骤。

在编译阶段,主要的任务就是将C语言代码全部转为汇编代码。要完成这些工作,需要执行下述代码:

这里需要注意的是对预处理之后的test.i文件进行操作。最终生成了test.s文件。

汇编

在汇编阶段,主要的任务就是把汇编代码全部转成二进制机器码,供编译器进行处理。要完成这些工作,需要执行下述代码:

这里需要注意的是是对编译阶段之后的test.s文件进行操作。 最终生成了test.o文件。

链接

什么是链接?为什么需要链接?

举个栗子,我们在C语言中学习了了scanf输入函数,实质上这个函数在进行实现时,我们是调用了C语言库中的函数进行实现,且库中的scanf的实现过程是很复杂的。那么调用库中的函数的过程就叫做链接,链接也分为静态链接和动态链接。简单来说,链接就是将我们的代码和库中的代码联系起来,最终生成可执行程序。

什么是静态链接?什么是动态链接?

如果我们把库中的代码拷贝进入了我们自己的代码中,通过联系最终生成可执行程序,那么就是静态链接,如果我们写的代码和库中的代码是分开的,通过联系最终生成可执行程序,那就是动态链接。静态链接和动态链接都有自己的优点,同样也都有自己的缺点,静态链接的优点是不用频繁的去库中调用函数,节省了效率,但是由于将库中的函数全部拷贝到了可执行程序中,就会导致可执行序占用的内存过大,是一种以空间换时间的做法。动态链接的优点就是占用的内存小,缺点是一旦库丢失,那么整个源文件的编译过程就会崩溃。

静态链接和动态链接对应的就是静态库和动态库。把库中的代码拷贝(这里说剪切更合适)到自己的代码中,此时的库就是静态库(后缀名为.a),库中的代码和自己写的代码如果是分开的,那么此时就是库就是动态库(后缀名为.so)。

要实现链接阶段的工作我们需要实现下述代码:

通过file mytest代码我们可以发现,gcc编译器在进行链接时,默认使用的是动态库,但是如果我们想要使用静态库,该怎样进行呢?我们可以使用下述代码实现:

使用时可能会有/usr/bin/ld: cannot find -lc的报错,这里是因为没有安装静态库。

使用yum -y install glibc-static即可安装静态库。

以上便是使用gcc编译器完成C语言程序编译的整个过程,g++编译器完成对C++程序的编译也是同理的。

本期内容到此结束^_^
 

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

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

相关文章

4.4 媒资管理模块 - 分布式任务处理介绍、视频处理技术方案

媒资管理模块 - 视频处理 文章目录 媒资管理模块 - 视频处理一、视频转码1.1 视频转码介绍1.2 FFmpeg 基本使用1.2.1 下载安装配置1.2.2 转码测试 1.3 工具类1.3.1 VideoUtil1.3.2 Mp4VideoUtil1.3.3 测试工具类 二、分布式任务处理2.1 分布式任务调度2.2 XXL-JOB 配置执行器 中…

TopAccess验证东芝刷卡打印机苹果电脑连接教程(适用于intel和苹果m芯片)

复制打印机IP地址到谷歌浏览器后回车,默认用户名:admin,密码:123456,点击登录按钮。如果有更改的请按照实际输入。 依次点击用户管理-用户账户-新建。如果需要新建部门的,可以点击用户管理-部门管理-新建。…

今天才知道原来它是这样的HTTP

HTTP介绍 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文…

JPEG格式详解Baseline、Progressive的区别

文章目录 JPEG的简介压缩质量/压缩比率色彩空间基线和渐进子采样存储选项 基线和渐进基线格式渐进格式: 子采样4:4:4(无损)4:2:24:2:0 JPEG的简介 JPEG(Joint Photographic Experts Group)是一种常见的图像压缩格式&a…

有些应用中不需要使用回原点指令

不是所有的轴运动控制,都一定要使用回原点指令来执行回原点 通过手动找到极限开关,然后往回走一段距离,也是一种方式,所谓的往回走的这段距离方便用于手动校准原点位置; 那使用原点指令回原点后,也可以走一…

【大厂算法面试冲刺班】day0:数据范围反推时间复杂度

常见算法的时间复杂度 规定n是数组的长度/树或图的节点数 二分查找:O(logn) 双指针/滑动窗口:O(n) DFS/BFS:O(n) 构建前缀和:O(n) 查找前缀和:O(1) 一维动态规划:O(n) 二维动态规划:O(n^2) 回溯…

Go采集1688网站数据对比商品价格

最近看了下多多和1688的一些商品价格,发现好多店铺都是无货源拿货一件发货,这就导致层层叠加价格翻了不知道几倍,真所谓多花钱办的事还是一样,因此,今天我就通过一个爬虫程序监控对应商品价格,了解行业龙头…

MCU、MPU、SOC简介

文章目录 前言一、MCU二、MPU三、SOC总结 前言 随着处理器技术的不断发展,CPU(Central Processing Unit)的发展逐渐出现三种分支,分别是MCU(Micro Controller Unit,微控制器单元) 和MPU(Micro Processor Unit,微处理器…

Java web设计:在线微友圈网站

项目背景 微友圈是一个基于Java Web开发的社交网络平台,旨在为用户提供一个轻松互动、分享生活和交流观点的在线社区。随着社交网络的普及,人们更加渴望与朋友、家人以及其他志同道合的人保持联系并分享彼此的生活点滴。微友圈的目标是打造一个简洁、高…

什么情况?DDD 中的每个任务都执行了两次?

最近在使用 COLA 框架自带的异步任务时,发现每次执行异步都执行了两次,如果一些没有做幂等的接口,这样是会有问题的,比如入库操作之类的,就会造成数据重复入库,造成严重 bug。 带着疑惑,开始了…

小巧且兼具高性能的小模型 TinyLlama 等

TinyLlama-1.1B 小模型在边缘设备上有着广泛的应用,如智能手机、物联网设备和嵌入式系统,这些边缘设备通常具有有限的计算能力和存储空间,它们无法有效地运行大型语言模型。因此,深入探究小型模型显得尤为重要。 来自新加坡科技…

搜维尔科技:第九届元宇宙数字人设计大赛作品规范解读!

作品提交 参赛小组需要将作品上传至百度网盘,并将分享链接发送至frankaxis3d.cn邮箱。邮寄格式如下: 邮件标题:作品名称元宇宙数字人设计大赛作品 邮件内容标明:学校名称、院系名称、作品名称、作者名称、联系电话及指导老师名…