Linux编译器-gcc或g++的使用

news2024/11/26 12:34:40

一.安装gcc/g++

在linux中是不会自带gcc/g++的,我们需要编译程序就自己需要安装gcc/g++。

很简单我们使用简单的命令安装gcc:sudo yum install -y gcc

g++安装:sudo yum install -y gcc-c++

我们知道Windows上区分文件,都是使用文件后缀来区分的,.txt是文本文件,.mp4是视频文件,.md是markdown文件等等。

在linux中一切皆文件,一个文件可以随便取名字,但是这样好吗?不见得。比如下面这样。

image-20240606150226762

test.txt文件中我编写的是c代码,使用gcc编译器编译该文件,显然从结果来看,是编译不过的。

使用mv修改test.txt为test.c,再使用gcc编译就能编译过了。

image-20240606150515492

结论:虽然linux中不关心文件的后缀,但是gcc/g++是要区分文件后缀的,gcc编译.c后缀的c文件,g++编译.cc/.cpp后缀的c++文件。

二.一个文件到可执行程序的步骤

在我们编一个源文件的时候,使用gcc或者g++时,都会直接生成可执行程序。
那为什么要生成可执行程序呢?因为机器只认识二进制语言,它可不懂什么代码,汇编,我们的目的就是把源代码变成机器语言,也就是二进制语言。

其实生成可执行程序之前都会有好几个步骤的:

先经过预处理,再编译,在汇编,在进行链接生成可执行程序,接下来我们就一步一步探讨一下具体步骤的作用。

1.预处理

预处理的主要功能:

①头文件的展开
②去注释
③条件编译
④宏替换

预处理的命令:gcc -E test.c -o test.i

这里的-E就是预处理的意思,-o是生成test.i文件。

编写代码来验证一下。

 #include<stdio.h>
  2 #define M 10
  3 
  4 #define v1 1
  5 int main()
  6 {
  7     //这是条件编译                                                          
  8 #if v1
  9     printf("这是普通版本的\n");
 10 #elif v2
 11     printf("这是会员版本的\n");
 12 #else
 13     printf("这是超级会员版本的\n");
 14 #endif
 15   printf("%d",M);
 18     return 0;
 19 }

image-20240606155315253

可以看出上面几百行全是stdio头文件的展开,然后我们写的注销也全部没有了,定义的宏M也被替换成了10,条件编译也成功的实现了,通过条件编译,可以实现对代码的动态裁剪

2.编译

编译就是把预处理后的文件生成汇编的过程。

编译的命令:gcc -S test.i -o test.s

验证:

image-20240606155436535

可以看出这里就是各种汇编的指令,我们也看不懂。

3.汇编

汇编也就是把汇编语言变成二进制语言。

汇编的命令:gcc -c test.s -o test.o

image-20240606160417442

这就是可被机器识别的目标文件(obj文件)。

4.链接

链接就是生成可执行程序。

链接命令:gcc test.o

链接可不是这么简单就完了,它还牵扯到库文件,待会细说。

三.gcc选项记忆

上面我们说到预处理,编译等,使用的命令是不是不好记,这里有个好记忆的方法。

使用的命令-E -S -c刚好对于键盘上的键ESC,只不过要记清楚,ES是大写,c是小写的。

依次生成的文件是iso,而在Windows中,iso是光盘镜像文件。

这样联系起来也就比较好记了。

但是我们实际上我们得到可执行文件,可不用这么复杂,直接使用gcc该文件即可。

四.函数库之静态库和动态库

对于printf函数这些,为什么我们代码中写了,电脑就知道它实现的是什么功能呢?

因为我们包含了头文件?也不全对,因为stdio头文件只是各种声明,还有各种宏定义而已。

我们现在所写的代码都是站在巨人的肩膀上,已经有人帮我们写好了可以直接可以使用的函数,也就是函数的实现,那这些函数在哪里呢?我怎么没有看到。

这就要引出来我们要说的库了,库包含各种函数的实现。

可执行程序=我们写的代码+头文件+库。

使用命令ls /lib64/libc.so.6可以查看库的位置。

image-20240606171237816

而库也分为静态库和动态库。默认情况下,云服务器上是没有安装c静态库的,只有动态库。

一般来说,linux中.so为动态库,Windows中.dll为动态库。

linux中.a为静态库,Windows中.lib为静态库。

安装c++静态库的命令:sudo yum install -y libstdc+±static。
安装c静态库的命令:sudo yum install -y glibc-static。

动态库是c/c++或者其他第三方提供的所有方法的集合,被所有程序以链接的方式关联起来。(动态链接)

这里的动态链接是库中所有的函数,都有入口地址,所谓的动态链接,其实就是把要连接的库中的函数地址拷贝到我们的可执行程序的特定位置!

静态库是c/c++或者其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码,拷贝到自己的可执行程序中。(静态链接)

我们可以将test.文件分别使用静态链接和动态链接得到可执行程序,来看看有什么区别。

动态链接:

image-20240606184328750

静态链接:

image-20240606185725454

test-d是动态链接出来的可执行文件,而test-s是静态链接出来的可执行文件,可以很清晰的看出,静态链接出来的可执行程序的文件大小是远大于动态链接的。

这里就可以总结出它们的优缺点了。

动态链接的优点:形成的可执行程序体积较小,比较节省资源的!
缺点:强依赖动态库,动态库没了,所有的依赖这个库程序都无法运行了。

静态库的优点:无视库,可以独立运行。
缺点:体积太大,浪费资源。

就像刚开始我们下载vs开发环境的时候,下载安装包内存不大,当我们选择c/c++下载得到时候,大小就会达到几个G。
这是因为当我们下载的开发环境的时候,它默认会为我们做以下工作:

①下载头文件,lib。
②设置合理的查找路径。

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

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

相关文章

linux系统——ping命令

ping命令可以用来判断对远端ip的连通性&#xff0c;可以加域名也可以加公共ip地址 这里发送出56字节&#xff0c;返回64字节

【C++修行之道】类和对象(四)运算符重载

目录 一、 运算符重载 函数重载和运算符重载有什么关系&#xff1f; 二、.*运算符的作用 三、运算符重载的正常使用 四、重载成成员函数 五、赋值运算符重载 1.赋值运算符重载格式 传值返回和引用返回 有没有办法不生成拷贝&#xff1f; 2. 赋值运算符只能重载成类的…

命令提示符方式获取笔记本电脑的电池使用情况和状态

1、键盘输入WinR,输入cmd&#xff0c;然后在命令提示符界面输入 powercfg/batteryreport2、将显示的路径复制到浏览器中查看

造假高手——faker

在测试写好的代码时通常需要用到一些测试数据&#xff0c;大量的真实数据有时候很难获取&#xff0c;如果手动制造测试数据又过于繁重无聊&#xff0c;显得不够优雅&#xff0c;今天我们介绍的faker这个轮子可以完美的解决这个问题。faker是一个用于生成各种类型假数据的库&…

多模态模型是什么意思(国内外的AI多模态有哪些)

在人工智能和机器学习的领域&#xff0c;我们经常会遇到一些专业术语&#xff0c;这些术语可能会让初学者感到困惑。其中&#xff0c;"多模态模型"就是这样一个概念。 什么是AI多模态。它是什么意思呢&#xff1f; 那么&#xff0c;多模态模型是什么意思呢&#xff1…

前端开发之中svg图标的使用和实例

svg图标的使用和实例 前言效果图1、安装插件2、vue3中使用2.1、 在components文件夹中,创建公共类SvgIcon/index.vue2.2、创建icons文件,存放svg图标和将所有的svg图标进行引用并注册成全局组件2.3、在man.js 中注册2.4、在vue.config.js中配置svg2.5、在vue中的调用svg图标3…

算法004:盛水最多的容器

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/container-with-most-water/ 这道题比较简单&#xff0c;使用双指针。 …

IIoT(智能物联网)的现状、应用及安全

近年来&#xff0c;物联网&#xff08;IoT&#xff09;作为推动现代公司和智能城市发展的一个范式&#xff0c;已经取得了显著的发展。IoT使得分布式设备&#xff08;如手机、平板电脑和计算机&#xff09;能够感知并从外部环境传输数据&#xff0c;以服务于最终用户。IoT的概念…

万字长文|OpenAI模型规范(全文)

本文是继《OpenAI模型规范概览》之后对OpenAI Model Spec的详细描述&#xff0c;希望能对各位从事大模型及RLHF研究的朋友有帮助。万字长文&#xff0c;建议收藏后阅读。 一、概述 在AI的世界里&#xff0c;确保技术的行为符合我们的期望至关重要。OpenAI最近发布了一份名为Mo…

【动态规划-BM78 打家劫舍(一)】

题目 描述 你是一个经验丰富的小偷&#xff0c;准备偷沿街的一排房间&#xff0c;每个房间都存有一定的现金&#xff0c;为了防止被发现&#xff0c;你不能偷相邻的两家&#xff0c;即&#xff0c;如果偷了第一家&#xff0c;就不能再偷第二家&#xff1b;如果偷了第二家&…

四种跨域解决方案

文章目录 1.引出跨域1.基本介绍2.具体演示1.启动之前学习过的springboot-furn项目2.浏览器直接访问 [localhost:8081/furns](http://localhost:8081/furns) 可以显示信息3.启动前端项目&#xff0c;取消请求拦截器&#xff0c;这样设置&#xff0c;就会出现跨域4.跨域原因 2.跨…

YOLOv8改进 | 卷积模块 | 在主干网络中添加/替换蛇形卷积Dynamic Snake Convolution

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 蛇形动态卷积是一种新型的卷积操作&#xff0c;旨在提高对细长和弯曲的管状结构的特征提取能力。它通过自适应地调整卷积核的权重&#xff0…

软件游戏找不到d3dx9_43.dll怎么办,三分钟教你解决此问题

在现代科技发展的时代&#xff0c;电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们可能会遇到一些问题&#xff0c;其中之一就是电脑缺失d3dx943.dll文件。这个问题可能会影响到我们的正常使用&#xff0c;因此了解其原因和解决方…

spring源码解析-(2)Bean的包扫描

包扫描的过程 测试代码&#xff1a; // 扫描指定包下的所有类 BeanDefinitionRegistry registry new SimpleBeanDefinitionRegistry(); // 扫描指定包下的所有类 ClassPathBeanDefinitionScanner scanner new ClassPathBeanDefinitionScanner(registry); scanner.scan(&quo…

SSL/TLS和HTTPS

HTTPS就是用了TLS包装的Socket进行通信的HTTP 混合加密 被称为混合加密。具体过程如下&#xff1a; 使用非对称加密协商对称密钥&#xff1a; 在通信的开始阶段&#xff0c;通常由客户端和服务器使用非对称加密算法&#xff08;如RSA&#xff09;来协商一个对称密钥。通常情…

2024年全国大学生数据统计与分析竞赛A题论文和代码:抖音用户评论数据统计与情感分析模型

2024年全国大学生数据统计与分析竞赛A题论文和代码已完成&#xff0c;代码为B题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#x…

【JavaScript】内置对象 - 字符串对象 ④ ( 根据索引位置返回字符串中的字符 | 代码示例 )

文章目录 一、根据索引位置返回字符串中的字符1、charAt 函数获取字符2、charCodeAt 函数获取字符 ASCII 码3、数组下标获取字符 String 字符串对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String 一、根据索引位置返回…

Oracle的优化器

sql优化第一步&#xff1a;搞懂Oracle中的SQL的执行过程 从图中我们可以看出SQL语句在Oracle中经历了以下的几个步骤&#xff1a; 语法检查&#xff1a;检查SQL拼写是否正确&#xff0c;如果不正确&#xff0c;Oracle会报语法错误。 语义检查&#xff1a;检查SQL中的访问对象…

语法分析!!!

一、实验题目 根据给定文法编写调试预测分析程序&#xff0c;对任意输入串用预测分析法进行语法分析。 二、实验目的 加深对预测分析法的理解。 三、实验内容 四、实验代码 #include <iostream> #include <stdio.h> #include <string> #include <…

鸿蒙? 车载?Flutter? React Native? 为什么我劝你三思,说点不一样的

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 引言 当今信息技术领域日新月异&#xff0c;各种新技术和新平台层出不穷。鸿蒙&#xff08;HarmonyOS&#xff09;、Flutter、以及车载应用开发…