Linux:gcc的相关知识

news2024/9/28 3:28:16

目录

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. 浪费资源

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

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

相关文章

HCIE之BGP基础练习(二)

BGP 一、BGP报文和状态机1.EBGP 建立邻居仅需一条命令2.IBGP之间建立邻居只需要三条命令3.EBGP之间用回环口建立邻居需要三条命令4.下一跳5.宣告路由6.full-math邻居7.路由反射器 一、BGP报文和状态机 1.EBGP 建立邻居仅需一条命令 [AR1]bgp 100 [AR1-bgp]router-id 1.1.1.1 […

Qt5项目拆解第一集解决:中文乱码| 全局字体|注册表|QSS/CSS

# 一、乱码解决代码片段 QTextCodec是Qt中用于处理文本编码和字符集转换的类。它提供了一系列静态函数来实现不同编码的文本转换,包括编码转换、字符集检测和转换、以及数据流中的文本编码处理。QTextCodec类使得Qt可以在不同的编码和字符集之间进行无缝转换,从而方便地处理…

帮你找到99%的电子书,这46个免费电子书网站,你还不知道吗?

国内网站:32个 1鸠摩搜书 网址:https://www.jiumodiary.com/ 一个强大的搜书神站,无论是什么类型的书籍,只要你知道书名,就可以轻松的搜到你想要书籍。页面简单明了,书籍种类繁多,格式多种多样…

linux修改文件夹下所有文件的权限(常用)

1、 修改文件夹下所有文件的权限 # filename为要修改的文件夹名字。-R应该是表示递归修改filename文件夹下所有文件的权限 sudo chmod -R 777 filename2、linux修改单个文件夹权限 sudo chmod 600 (只有所有者有读和写的权限) sudo chmod 644 &#…

基于sentinel-2 遥感数据的水体提取(水体指数法)

本文框架设置如下: 简单介绍senintel-2数据;如何利用sentinel-2数据获取水体边界/范围 1 Sentinel-2数据介绍及下载方式 有Sentinel-2A/2B两颗卫星,其参数基本一致,因此两颗卫星的数据联合使用很方便。 分辨率有:1…

助力医疗数字化转型,贝锐x医百科技案例解析

在医疗数字化这个历史进程的大浪潮中,医药企业扮演着重要的角色,其重要程度恐怕仅次于医疗机构本身。同时,数字化转型对于医药企业的赋能作用也是十分明显的,尤其在营销端,一系列的数字化管理、数字化推广方案已经成为…

前端开发中的那些规范

开发中的那些规范 俗话说:无规矩不成方圆。生活如此、软件开发也如此。 来聊一聊开发中有哪些地方需要规范。 为什么需要规范 现在开发一个应用基本上都是多人协作,一旦涉及到多人,必然不同的开发者的开发习惯、编码方式都是有所不同的&…

常用电子器件学习——三极管

三极管介绍 三极管,全称应为半导体三极管,也称双极型晶体管、晶体三极管,是一种电流控制电流的半导体器件其作用是把微弱信号放大成幅度值较大的电信号, 也用作无触点开关。晶体三极管,是半导体基本元器件之一&#xf…

NAT地址转换协议

目录 NAT应用场景静态NAT动态NATNAPTEasy IPNAT服务器 点击跳转NAT配置(动态nat,静态nat,Easy IP) NAT应用场景 - 随着网络设备的数量不断增长,对IPv4地址的需求也不断增加,导致可用IPv4地址空间逐渐耗尽…

2023蓝帽杯初赛取证

排名:37 取证检材容器密码:Hpp^VFQ6bdWYKMjXgUPG#hHxw!jM9 案件详情 2021年5月,公安机关侦破了一起投资理财诈骗类案件,受害人陈昊民向公安机关报案称其在微信上认识一名昵称为yang88的网友,在其诱导下通过一款名为维…

什么是通配监听端口? 什么是通配监听IP?

什么是通配监听端口? 监听端口: 指的是服务器或服务开启的特定TCP或UDP端口号,等待客户端连接或发送数据。TCP/IP协议下每个端口只能由一个服务独占监听,一个服务或应用会指定监听特定的一个或多个端口来接收客户端的连接请求。 例如 Web…

【学网攻】 第(6)节 -- 三层交换机实现VLAN间路由

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan【学网攻】 第(5)节 -- Cisco VTP的使用 前言 网络已经成为了我们生活中不可或缺的一部分,它连接了…

雪花算法生成ID【细糠】

目录 🧂1.ID生成规则 🥓2.UUID 🌭3.数据库自增主键 🍿4.雪花算法 1.ID生成规则 1. 全局唯一2.趋势递增3.单调递增4.信息安全5.含时间戳 2.UUID UUID(Universally Unique Identifier)的标准型式包含32个16进制数字,以连字…

UF_UI_select_with_single_dialog()通过单选对话框选择单个对象。对象可以通过光标或输入名称进行选择。对象被突显出来。

int response0;//返回用户操作类型,点了哪一种返回取消或者确定tag_t objtagNULL_TAG;//输出选择对象tag;double cursor[ 3 ];//输出光标位置tag_t view_tagNULL_TAG;//输出视图tag;UF_UI_select_with_single_dialog("请选择一个对象","获取对象类型…

前端echarts图形报表常见的样式配置

文章目录 🐒个人主页🏅Vue项目常用组件模板仓库📖前言:🐕1.深色主题🐕2.改变柱状图颜色🐕突然发现去问ai,更容易理解,那就不总结了 🐒个人主页 🏅…

浪花 - 用户加入队伍

一、接口设计 1. 请求参数:TeamJoinRequest package com.example.usercenter.model.request;import lombok.Data; import java.io.Serializable;/*** 加入队伍请求参数封装类*/ Data public class TeamJoinRequest implements Serializable {private static final…

计算机设计大赛 交通目标检测-行人车辆检测流量计数 - 计算机设计大赛

文章目录 0 前言1\. 目标检测概况1.1 什么是目标检测?1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计…

详细的程序员简历模板.pdf (附简历模板)

Q:什么是高水平的简历? A:满足HR需求的同时,最大化的体现自身价值的简历是高水平的简历 HR的需求是什么? ✅ HR想看到清晰专业的简历模板 ——家人们每天看几百份简历谁懂啊!花里胡哨真看不下去一点&…

Django框架二

一、模型层及ORM 1.模型层定义 负责跟数据库之间进行通信 2.Django配置mysql 安装mysqlclient,mysqlclient版本最好在13.13以上pip3 install mysqlclient 如果win安装报错,就去这两个网站中找 https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient m…

基于springboot+vue的美容院管理系统(前后端分离)

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