Linux:gcc的相关知识

目录

gcc的翻译(编译)过程:

预处理:

 条件编译:

编译:

汇编&链接:

什么是链接?

安装静态库:

静态库的使用:

动态静态的对比:

优缺对比:


gcc 是一个将C语言文件变成可执行文件的工具。 

在Linux中,如果需要将一个C语言文件变得可以执行,那么除了这个文件本身的内容是C语言编写的内容外,还需要gcc这个编译工具进行编译才行。

gcc 使用的格式方法:

 gcc  要编译的文件 

//在该代码下,gcc默认会将编译后的可执行文件改名为 a.out 

//但是这种编译方式是最新版本的,老版本可能不支持,所以在编译的过程中需要一点改变

gcc  需要编译的文件 -std=c99

//而若想要换一个名字,使得编译出的文件不在是a.out 则需要使用以下代码

gcc 需要编译的文件 -o 新名字 -std=c99 

//或是

gcc -o 新名字 需要编译的文件 -std=c99

默认用法 

改名用法 

另外,用于编译c++的g++命令也可以编译C语言,且g++编译c++的方法和gcc编译C语言的方法大致相同,但不同的是gcc并不能编译c++

gcc的翻译(编译)过程:

gcc的翻译过程总共可以分为四步,分别是预处理、编译、汇编、链接。

预处理:

以 test.c文件为例进行预处理,需要注意的test.i是自己定义的文件名字,而且.i一般是预处理文件的后缀 

gcc -E tset.c -o test.i

//-E的含义是从现在开始进行程序的翻译,预处理完成就停下

如图所示,左边是原本的文件内容,而右边是经过预处理后的文件,可以注释的消失,以及有着八百多行的代码,除去主函数,另外八百多行代码其实是头文件的展开部分,预处理过程中会将头文件进行展开然后挑选出合适的粘贴在文件代码上方。

 条件编译:

而预处理也可以执行条件的编译,在文件代码中设置了条件限制,而我们需要调用条件来进行摘取代码内容时,通常使用的代码是 gcc -D执行的条件 需要裁剪的文件 

但是我们可以在文件中设置条件,直接使用预处理的方法,就可以进行条件的裁剪了!

裁剪前 

预处理裁剪后 

编译:

当然编译的时也可以直接从.c文件从头开始,或者如下代码一样从预处理的文件开始

gcc -S tset.i -o test.s

//-S 的意思就是从现在开始进行程序的编译,编译完成就停下来

编译后的代码 

汇编&链接:

汇编:
gcc -c test.s -o test.o

从现在开始进行程序的汇编,汇编完成就停下来,而汇编之后的文件并不是最终的文件,文件若是要正常的执行则需要两个条件:

  1. 本身就是可以执行的文件
  2. 文件的内容必须是可执行的 

上文讲诉过,汇编之后的文件是二进制的目标文件,而二进制的目标文件本身就是不可以被执行的文件,所以需要将这个文件进一步的转化,也就说最后一步,链接!

链接:
gcc test.o -o my.exe

所以连接是最重要的,而链接又是什么呢?

什么是链接?

链接是库和程序的结合,当一个语言被发明的时候是有一套标准的,而这个库也就表示着语言的标准库。

使用ldd命令查看文件所用的库 

当然,库也分类,在Linux中分为两种,第一种是动态库,通常以.so为后缀,且链接一般默认使用的库就是动态库,而另一种是静态库,是以.a为后缀的,并且在Linux中默认是没有静态库的存在,所以需要自己安装。

安装静态库:

sudo yum install -y glibc-static libstdc++-static

静态库的使用:

gcc -o  指定名字  链接的文件  -static

动态静态的对比:

占用空间大小的对比,前者是动态,后者是静态 

库的链接对比,前者是动态,后者是静态 

优缺对比:

  • C动态库,默认提供的
  • gcc默认形成的可执行程序,默认采用动态链接

动态库&&动态链接的优缺点:

  1. 不能丢失
  2. 节省资源

静态库&&静态链接的优缺点:

  1. 一旦形成,和库无关
  2. 浪费资源

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

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

相关文章

类和对象(友元、运算符重载、继承、多态)---C++

类和对象 4.友元4.1全局函数做友元4.2类做友元4.3成员函数做友元 5.运算符重载5.1 加号运算符重载5.1.1成员函数实现运算符重载5.1.2全局函数实现运算符重载 5.2 左移运算符重载5.2.1全局函数实现运算符重载5.2.2成员函数实现运算符重载 5.3 递增/递减运算符重载5.3.1 前置5.3.…

软件产品为什么要测试才能上线?测试可以发现所有bug吗?

在现如今信息时代,软件产品已经成为人们生活中不可或缺的一部分。无论是在工作中还是在娱乐休闲时,我们都需要依赖各种软件来完成各种任务。然而,你是否注意到了身边的软件产品都是经过严格的测试才能上线的呢?那么为什么软件产品必须要经过…

操作系统【OS】Ch2 进程同步与互斥机制

进程同步与互斥机制1:硬件和软件方法 硬件方法 也称为低级方法、元方法 不能实现让权等待 中断屏蔽 使用开/关中断指令实现简单高效只适用于单处理机只适用于操作系统内核进程【因为关中断的权力不能交给用户】 TestAndSet 实现简单适用于多处理机不满足让权等待…

【GAMES101】Lecture 09 重心坐标

我们之前说着色过程中以及这个计算法线的时候需要用到这个插值(Interpolation),然后插值是通过这个重心坐标(Barycentric Coordinates)来实现的 目录 重心坐标 插值 重心坐标 注意哈我们这里说的三角形的重心坐标并…

RT-DETR优化改进:IoU系列篇 | Focaler-IoU​​​​​​​更加聚焦的IoU损失Focaler-IoU |2024年最新发表

🚀🚀🚀本文改进:Focaler-IoU更加聚焦的IoU损失Focaler-IoU,能够在不同的检测任务中聚焦不同的回归样本,使用线性区间映射的方法来重构IoU损失 🚀🚀🚀RT-DETR改进创新专栏:http://t.csdnimg.cn/vuQTz 🚀🚀🚀学姐带你学习YOLOv8,从入门到创新,轻轻松松搞…

(2024,强化学习,扩散,奖励函数)扩散模型的大规模强化学习

Large-scale Reinforcement Learning for Diffusion Models 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 3. 方法 3.1. 使用多步骤 MDP 的策略梯度 3.2. 基于分布的奖励函…

正则表达式初版

一、简介 REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通…

Docker部署

Docker简介 Docker是一个开源的容器引擎,它有助于更快地交付应用。 Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用 Docker可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。 &a…

数据结构奇妙旅程之二叉树题型解法总结

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

影响可变利差有几个因素,Anzo Capital先说两个

了解利差的变化规律,盈利赚钱还不是轻轻松松的事情,但Anzo Capital想问各位投资者,你们知道影响可变利差的价值有几个因素吗?今天就先抛砖引玉,先说两个影响可变利差的因素。 首先就是交易工具的流动性——商品快速买…

精通 VS 调试技巧,学习与工作效率翻倍!

​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ ​ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 ​ 所属专栏:C语言学习 ​ 贝蒂的主页:Betty‘s blog 1. 什么是调试 当我们写代码时候常常会遇见输出结果不符合我们预…

【三维重建】双目立体视觉

通过极几何可以求得极线,现在我们需要将左边的图变成右边的平行视图。 所有的极线都经过极点(e/e),如果极点位于无穷远处,那所有的极线都平行。 (极几何的基础知识可以参考这篇文章:【三维重建】对极几何-CSDN博客) 平行视图中&…

modbus poll测试工具测试modbus tcp与PLC设备连接使用方法

socket默认端口是502,socket连上之后, 按照modbuspoll工具设置的读写参数 生成的RTU命令格式去组装读PLC的设备数据 modbuspoll工具配置,以v9.9.2中文破解版为例: 首先点连接菜单(connection)建立连接&…

基于springboot+vue的IT技术交流和分享平台系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

【latex】在Overleaf的IEEE会议模板中,快速插入参考文献

【LaTeX】在Overleaf的IEEE会议模板中,快速插入参考文献 写在最前面第一步:在文献检索网站导出引用文献的bib文件第二步:编辑overleaf模版方法二:EduBirdie生成参考文献(补充)使用LaTeX在Overleaf的IEEE会议…

《Linux高性能服务器编程》笔记07

Linux高性能服务器编程 本文是读书笔记,如有侵权,请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第14章 多线程编程14.1 Linux线程概述14…

汇编实验报告

汇编实验 实验4 分支程序设计实验5 循环程序设计 实验4 分支程序设计 一、实验目的 理解分支程序结构的特点,掌握分支结构程序的编写。 二、实验内容 (1)验证单分支结构的字母判断程序(教材例4-10),编写数…

基于蒙特卡洛模拟的家用电动汽车充电负荷预测(MATLAB实现)

采用蒙特卡洛模拟法,对家用电动汽车充电负荷进行预测,电动汽车分为快、中、慢三种充电功率,且分为一天一充、一天两充、一天三充三种类型。全部MATLAB代码在下方给出,可以直接运行。 %%%%%%%%%%%%%%%%%%%%%%%%输入电动汽车相关原…

前端开发WebStorm

WebStorm是一款功能强大的JavaScript集成开发环境,凭借智能代码补全、实时分析和代码重构、集成版本控制、强大的调试和测试工具、实时预览和集成前端工具以及自定义配置和插件支持等功能,成为开发者首选的利器。 前端开发WebStorm WebStorm是一款功能强…

使用POI生成word文档的table表格

文章目录 使用POI生成word文档的table表格1. 引入maven依赖2. 生成table的两种方式介绍2.1 生成一行一列的table2.2 生成固定行列的table2.3 table合并列2.4 创建多个table存在的问题 使用POI生成word文档的table表格 1. 引入maven依赖 <dependency><groupId>org.…