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++程序的编译也是同理的。

本期内容到此结束^_^
 

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

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

相关文章

优化改进YOLOv8算法之AKConv(可改变核卷积),即插即用的卷积,效果秒杀DSConv

目录 1 AKConv原理 1.1 Define the initial sampling position 1.2 Alterable convolutional operation 1.3 Extended AKConv 2 YOLOv8中加入AKConv模块 2.1 AKConv.py文件配置 2.2 task.py配置 2.3 创建添加优化点模块的yolov8-AKConv.yaml 2.4 训练 1 AKConv原理 …

什么事“网络水军”?他们的违法活动主要有四种形式

我国治理网络水军,包括造谣引流、舆情敲诈、刷量控评、有偿删帖等各类“网络水军”等违法犯罪活动已经许久。 日前,官方召开新闻发布会,公布了相关的一些案件进程,今年已累计侦办相关案件339起,超过历年的全年侦办案件…

国产系统-银河麒麟桌面版安装wps

0安装版本 系统版本 版本名称:银河麒麟桌面版操作系统V10(SP1) 软件版本 wps个人版2019 1双击安装 1.1卸载自带wps 为什么要卸载没有序列号,授权过期,不是免费的,通过先安装/在升级个人版跳过输入序列号问题等等原因 1.1.1当前自带的wps版本 1.1.2卸载 不卸载无法安装在…

rime中州韵小狼毫 随机数 随机码 电脑信息 滤镜

在输入法中支持生成GUID,或者随机数,随机字符,获取自身电脑信息,这将是一个非常酷的功能。 先睹为快 本文所分享滤镜,主要用于生成一些动态的信息词条,效果如下👇: GUID.lua GU…

c JPEG编码,但有错误

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/videodev2.h> //v4l2 头文件 #include <strin…

阿里云 WindowsServer 使用之 配置 SQL Server 允许远程连接

阿里云 WindowsServer 使用之 配置 SQL Server 允许远程连接 第一步&#xff1a;安装 SQL Server 数据库 这是一个很详细的安装教程&#xff0c;可以参考一下 安装SQL Server详细教程 需要注意&#xff1a;安装实例时&#xff0c;建议在‘身份验证模式’直接选择“混合模式”…

MySQL决战:MySQL数据导入导出

目录 前言 一.navact数据导入导出&#xff08;第三方工具&#xff09; 1.导入数据 2.数据导出 二. mysqldump命令导入导出数据 1.mysqldump介绍 2.数据导出 3.数据导入 三.load data file进行数据导入导出&#xff08;只限于单表&#xff09; 1.数据导出 增加导出权…

springboot学生成绩管理系统源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

市场复盘总结 20240109

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 昨日主题投资 连板进级率 66% 二进三&#xff1a; 进级率低 最常用的二种方法&#xff1a; 方法一&#x…

洛谷 P1217 [USACO1.5] 回文质数 Prime Palindromes 刷题笔记

P1217 [USACO1.5] 回文质数 Prime Palindromes - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 直接枚举 减枝优化判断 优化1 只有偶数才会是质数 优化2 回文数的判断次数要优于检查素数 先判断是否为回文数再检查是否为质数 if( hw(i)&&isprime(i)) 这里…

【自学笔记】01Java基础-07面向对象基础-03常量、枚举类、抽象类、多态详解

记录java基础学习中有关常量、枚举类、抽象类和多态的内容。 1 常量 什么是常量&#xff1f; 常量是使用了public static final修饰的成员变量&#xff0c;必须有初始化值&#xff0c;而且执行的过程中其值不能被改变。 常量名的命名规范&#xff1a;英文单词全部大写&#x…

Balking模式-实例

Balking模式 所谓Balk就是停止并返回的意思。 如果守护条件不成立&#xff0c;则立即中断处理。 因为Guarded Suspension模式是一直等待至可以运行。 当写入的内容与上次写入的内容完全相同时&#xff0c; 再向文件写入就显得多余了&#xff0c; 所以就不再执行写入操作。 也就…

HTML---JQurey的基本使用

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 本章目标 &#xff08;1&#xff09;能够搭建jQuery开发环境 &#xff08;2&#xff09;使用ready( )方法加载页面、掌握jQuery语法 使用addClass( )方法和css( )方法为元素添加CSS样式使用n…

创建一个矩形中有两个三角形

#include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream>float vertices[] {// 第一个三角形0.5f, 0.5f, 0.0f, // 右上0.5f, -0.5f, 0.0f, // 右下-0.5f, -0.5f, 0.0f, // 左下-0.5f, 0.5f, 0.0f, // 左上 };unsigned i…

Qt QProcess进程间调用及交互通信,完整示例

1. 概述 使用Qt进行应用程序开发&#xff0c;主要是通过QProcess类用于启动外部程序并与其进行通信. 1.1. 运行进程 要启动进程&#xff0c;需要运行的程序的名称和命令行参数作为参数传递给start()。参数以QStringList形式提供。 start()方法原型&#xff1a; void start(…

华为为什么要开发鸿蒙系统,这对开发者有什么影响?

华为为什么要开发鸿蒙系统&#xff0c;这个问题有多方位的解答。 1、华为自主可控&#xff0c;摆脱漂亮国的限令 在美国禁令的威胁下&#xff0c;华为面临着被迫使用漂亮国产品和技术的风险。鸿蒙系统的推出&#xff0c;可以让华为摆脱对于漂亮国技术的依赖&#xff0c;实现技…

两种方式实现mysql截取年月日

select date_format(now(), %Y-%m-%d) select substring(now(), 1, 10)

kubernetes入门到进阶(5)

目录 镜像仓库&#xff1a;怎么用好docker hub这个宝藏 什么是镜像仓库&#xff08;Registry&#xff09; 什么是docker hub 如何在docker hub上挑选镜像 docker hub上进行概念股命名规则是什么 该怎么上传自己的镜像 离线环境该怎么办 小结 镜像仓库&#xff1a;怎么用好docke…

【前端素材】bootstrap4实现在线蛋糕甜品店网页Tehzeeb

一、需求分析 在线蛋糕甜品店的网站通常包含以下几个方面的内容和功能&#xff1a; 主页&#xff1a;网站的主页是用户进入网站的第一个页面&#xff0c;通常会展示一些精选蛋糕和甜品的图片和介绍&#xff0c;以吸引用户的注意力。主页还可能包含一些特别促销或最新的产品信息…

开源拖拽表单设计器好用吗?

很多客户朋友会对开源拖拽表单设计器产生浓厚兴趣&#xff0c;因为不知道它是怎么用的&#xff0c;好不好用&#xff0c;所以经常会有粉丝朋友询问我们关于开源拖拽表单设计器的功能、作用以及优势特点。在现代化职场办公中&#xff0c;传统的表单制作存在一定的缺点和遗憾&…