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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

前言

设计样例,先见一下

方案一:

方案二:

在企业里面一般维护软件的源代码的话,要维护几份?

方案一:

方案二:

程序的翻译过程

预处理(进行宏替换)

编译(生成汇编语言)

汇编(生成机器可识别代码)

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

函数库

函数库一般分为静态库和动态库两种。

安装一下gcc和g++的静态库

总结


前言

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!


提示:以下是本篇文章正文内容,下面案例可供参考

设计样例,先见一下

我们先生成一个可执行程序:

方案一:

我们现在vim中写一段简单的代码。

我们可以用gcc尝试编译一下,看看能否编译过去。

我们先来查看一下gcc的版本。

接下来执行可执行程序。

我们生成的可执行程序也可以自己起一个名字。

方案二:

我们来看一下另一种方法,看看不需要更换gcc的版本号是否可以。

我们来看一下结果。

Linux不会在意文件的后缀,但是gcc/g++这个Linux中的编译器会在意文件的后缀。
gcc不能用来编译c++的文件,gcc是用来编译c语言的、而g++既能编译c语言,也能编译c++。
c++文件的后缀:.cc或.cpp或.cxx。

我们在Xshell中安装一下g++的软件。

在企业里面一般维护软件的源代码的话,要维护几份?

给你一个个人版,再给你一个专业版(个人版的功能没有专业版的功能多),如果按两份来维护的话,比如个人版里面有一个bug,我们把这个bug修正之后,我们的专业版可能也要重新修正;比如专业版里面有bug的话,个人版里面还不一定有,如果有,你也要修正个人版;所以一份有bug的话,我们两个都得看,都得测试,这样太麻烦了,其实我们是可以维护一份源代码的。

那么如何只维护一份源代码?

我们这里引入一个新的方法“条件编译”!

条件编译:它可以根据你指明的编译条件,就可以实现对代码的动态裁剪

我们写一段带有“条件编译”的代码:

将生产的可执行程序运行,查看一下结果。

我们来看一下“条件编译”的使用方法。

方案一:

加入一个宏定义:

上面的#elis V2改成#elif V2,不好意思,上面的写错了!

查看一下结果:

方案二:

上面代码的功能指的是:在软件里面都是某些功能的函数,你想让他有哪些功能,就在对应的代码块里面,把对应函数调用加上。

所以我们只需要维护这一份的代码就可以了,你需要什么样的功能,我们就根据编译条件,对代码进行的动态裁剪。

程序的翻译过程

预处理(进行宏替换)

gcc –E test.c –o test.i

选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。

选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。

预处理指令是以#号开头的代码行。

编译(生成汇编语言)

gcc –S test.i –o test.s

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

用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

汇编(生成机器可识别代码)

gcc –c test.s –o test.o

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

读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了

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

gcc test.o –o my.exe

把我们自己写的代码,编译成目标文件,然后和标准库链接,生成可执行程序。

函数库

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

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

函数库一般分为静态库动态库两种。

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

动态链接:提前直到目标库的地址。共享动态库,但是一旦动态库缺失,所有的动态链接这个库的程序,都无法执行了!

动态库与之相反,在编译链接时已经知道了需要的库文件中函数的位置,并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库, 这样可以节省系统的开销。动态库一般后缀名为“.so”, 如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后, gcc 就可以生成可执行文件, 如下所示。gcc test.o –o my.exe

gcc默认生成的二进制程序,是动态链接的,这点可以通过file命令验证。

举个例子:静态链接:如果内存里有10个可执行程序,比如:每一个可执行程序都要用到printf()函数,那么10个可执行程序,就得拷贝10个printf()函数,所以系统里printf()函数会出现10份。
动态链接:等需要printf()函数方法的时候,只需要跳转到那里就可以了,不需要加载。

我们来验证一下:

安装一下gcc和g++的静态库


总结

好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。

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

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

相关文章

mysql数据库事务(事务设置、隔离级别、实现原理)

目录 事务 数据库事务 事务特性 事务设置 事务隔离级别 1.读未提交 2.读已提交 3.可重复读 4.串行化 事务实现原理 原子性:undolog 持久性:redolog 隔离性: 如果隔离级别是读已提交: 如果隔离级别是可重复读: 事务…

【Linux】 开始使用 gcc 吧!!!

Linux 1 认识gcc2 背景知识3 gcc 怎样完成 ?3.1 预处理预处理^条件编译 3.2 编译3.3 汇编3.4 链接 4 函数库5 gcc 基本选项Thanks♪(・ω・)ノ谢谢阅读下一篇文章见!!! 1 认识gcc 我们在windows环…

系统架构设计师教程(十六)嵌入式系统架构设计理论与实践

嵌入式系统架构设计理论与实践 16.1 嵌入式系统概述16.1.1 嵌入式系统发展历程16.1.2 嵌人式系统硬件体系结构16.2 嵌入式系统软件架构原理与特征16.2.1 两种典型的嵌入式系统架构模式16.2.2 嵌入式操作系统16.2.3 嵌入式数据库16.2.4 嵌入式中间件16.2.5 嵌入式系统软件开发环…

智能风控体系之divergence评分卡简介

评分卡模型的出现据说最早是在20世纪40年代,Household Finance and Spiegel和芝加哥邮购公司第一次尝试在贷款决策过程中使用信用评分.但是这两家公司都终止了这项业务。后来,在20世纪50年代末,伊利诺伊州的美国投资公司(AIC&…

《WebKit 技术内幕》学习之十四(1):调式机制

第14章 调试机制 支持调试HTML、CSS和JavaScript代码是浏览器或者渲染引擎需要提供的一项非常重要的功能,这里包括两种调试类型:其一是功能,其二是性能。功能调试能够帮助HTML开发者使用单步调试等技术来查找代码中的问题,性能调…

Spring Boot 模块工程(通过 Maven Archetype)建立

前言 看到我身边的朋友反馈说,IDEA 新建项目时,如果通过 Spring Initializr 来创建 Spring Boot , 已经无法选择 Java 8 版本,通过上小节的教程,不知道该如何创建 Spring Boot 模块工程。如下图所示: 一.IDEA 搭建 …

Kafka(八)使用Kafka构建数据管道

目录 1 使用场景2 构建数据管道时需要考虑的问题2.1 及时性2.2 可靠性高可用可靠性数据传递 2.3 高吞吐量2.4 数据格式2.5 转换ETLELT 2.6 安全性2.7 故障处理2.8 耦合性和灵活性临时数据管道元数据丢失末端处理 3 使用Connect API3.1 Connect的数据处理流程sourcesinkconnecto…

IP组播地址

目录 1.硬件组播 2.因特网范围内的组播 IP组播地址让源设备能够将分组发送给一组设备。属于多播组的设备将被分配一个组播组IP地址 组播地址范围为224.0.0.0~239.255.255.255(D类地址),一个D类地址表示一个组播组。只能用作分组的目标地址。源地址总是为单播地址…

丝路昆仑文物展:启用网关,文物预防性保护设备数据无缝对接平台

一、多功能网关数据无缝流转 近日,“丝路昆仑——新疆文物精品展”在天津博物馆开展。展览分为三部分:“丝路前奏”、“丝路华响”和“丝路梵音”,前两部分是以张骞凿通西域前后的中原西域两地文化交流,第三部分则讲述了佛教沿西…

【并发】什么是 Future?

🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 关键特性和操作包括: 提交任务: 查询完成状态: 等待结果: 取消任务&#xff1a…

golang整合rabbitmq,创建交换机并绑定队列

1,如果要开发消息队列,需要创建交换机和队列,通常有2中方式创建,1种是在面板直接创建 2,第二种就是在代码中创建,这里 展示的是go语言代码中创建rabbitmq package mainimport ("fmt""log""github.com/streadway/amqp" )func main() {// 连接R…

年销180万辆的特斯拉,护城河却在崩塌

文|刘俊宏 2023年率先开启汽车价格战的马斯克,伤敌一百自损八千? 在1月25日的特斯拉2023Q4财报电话会上,特斯拉CEO马斯克对中国公司的竞争力如此感叹道,“要是没有贸易壁垒,他们将摧毁(destroy…

SpringBlade微服务开发平台

采用前后端分离的模式,前端开源两个框架:Sword (基于 React、Ant Design)、Saber (基于 Vue、Element-UI)后端采用SpringCloud全家桶,并同时对其基础组件做了高度的封装,单独开源出一个框架:BladeToolBladeTool已推送至…

Git--创建仓库(1)

git init Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。 在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有…

通俗易懂理解SegNet语义分割模型

重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。 一、参考资料 深度学习之图像分割—— SegNet基本思想和网络结构以及论文补充 一文带你读懂 SegNet(语义分割) 二、相关介绍 1. 上采样(…

vue3中使用markdown编辑器

首先安装 npm i md-editor-v3 Setup 模板 <template><MdEditor v-model"text" /> </template><script setup> import { ref } from vue; import { MdEditor } from md-editor-v3; import md-editor-v3/lib/style.css;const text ref(Hell…

R语言-检验正态性

1.为什么要检验正态性 首先需要明确正态性与正态分布是有区别的&#xff0c;正态分布&#xff08;标准分布&#xff09;是统计数据的分布方式&#xff0c;是个钟形曲线&#xff0c;已平均值为对称轴&#xff0c;数据在对称轴两侧对称分布。正态性是检验实际数据与标准正态分布…

消息中间件之八股面试回答篇:一、问题概览+MQ的应用场景+RabbitMQ如何保证消息不丢失(生产者确认机制、持久化、消费者确认机制)+回答模板

问题概览 目前主流的消息队列技术&#xff08;MQ技术&#xff09;分为RabbitMQ和Kafka&#xff0c;其中深蓝色为只要是MQ&#xff0c;一般都会问到的问题。浅蓝色是针对RabbitMQ的特性的问题。蓝紫色为针对Kafka的特性的问题。 MQ的应用场景 MQ主要提供的功能为&#xff1a;异…

Linux shell编程学习笔记42:hdparm命令

ChatGPT 和文心一言哪个更好用&#xff1f; 从智能回复、语言准确性、知识库丰富度等方面比较&#xff0c;两大AI助手哪个更胜一筹&#xff1f;快来和我们分享一下你的看法吧~ 0 前言 获取硬盘序列号是信息资产管理和信息安全检测中经常要收集的信息&#xff0c;对于Linux来说…