gcc [linux]

目录

背景知识

gcc如何完成

格式

预处理(进行宏替换)

编译(生成汇编)

汇编(生成机器可执行码)

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

函数库

静态库

静态链接优势

动态库

动态链接优势

区别

区分动静态链接

指定静态链接

指令记忆


背景知识

1.预处理(进行宏替换)

2.编译(生成汇编)

3.汇编(生成机器可执行码)

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

gcc如何完成

格式

gcc [选项] 被编译文件 [选项] [目标文件]

预处理(进行宏替换)

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

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

实例:  gcc -E code.c -o  code.i

选项 -E,让gcc在预处理结束后停止编译过程

选项 -o是指目标文件

.i是指文件已经进行预处理的c原始程序  

编译(生成汇编)

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在

检查 无误后,gcc 把代码翻译成汇编语言

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

实例:gcc -S code.i  -o  code.s

汇编(生成机器可执行码)

汇编阶段就是把编译阶段生成的".s"文件转换成目标文件,这个文件是二进制文件,里面都是0和1

实例:gcc -C code.s -o code.o

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

在成功编译之后就如链接阶段,文件经过链接,通过函数地址,找到相对应的函数合并到一起生成可执行文件

实例:gcc code.o -o code

函数库

系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到

系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函
数了,而这也就是链接的作用

静态库

这类库的名字一般是libxxx.a;

1、利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了

2、即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点

3、因为如果静态函数库改变了,那么你的程序必须重新编译

静态链接优势

不受库的影响,可移植性比较好,没有与库链接的过程,节省时间

缺点:

如果多个文件都用了同一个库函数,就要拷贝多次,代码冗余量高

因为有大量的拷贝内容,所以静态链接形成的可执行程序比较大

动态库

这类库的名字一般是libxxx.so;

相对于静态函数库

1、动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小

2、由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库,动态函数库的改变并不影响你的程序

3、所以动态函数库的升级比较方便

动态链接优势

1.生成的可执行程序小

2.加载到内存中的速度快

3.节省资源(包括磁盘,网络,内存)

缺点在于:过于依赖动态库,导致程序的可移植性差。

区别

1、静态库是.o文件的合集,动态库是.o文件链接过后的产物。动态库链接过后的产物跟可执行文件是一个等级

2、静态库链接时需要拷贝一份完整的文件到目标文件中,然后一起链接生成可执行文件,而动态库不需要,动态库分动态加载库和动态链接库,动态加载库是程序运行时需要的时候才会被加载到内存中,动态链接库是项目生成的可执行文件被加载到内存中时,顺带着也会将动态链接库加载到内存中,这种方式会导致系统资源浪费。

3、依赖静态库的可执行文件体积较大,而且修改静态库之后需要重新编译生成,而依赖动态库的可执行文件和动态库实际是分开的,动态库改变之后只需要将动态库重新编译链接生成即可,不影响可执行文件

区分动静态链接

file+文件名    查看文件属性

ldd+可执行程序   查看文件所依赖的库

动态链接:前缀为lib,后缀为.so

静态链接:前缀为lib,后缀为.a

指定静态链接

当我不指定时Linux将自动采用动态链接,如果要使用动态链接就要在编译生成可执行文件时加上static 选项gcc test.c -o mytest -static

静态链接比动态链接产生的文件大得多

如果系统中没有动态库只有静态库,那么即使不指定-static,生成的可执行文件也是动态链接的

指令记忆

ESC  

iso

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

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

相关文章

Wsl2 Ubuntu在不安装Docker Desktop情况下使用Docker

目录 1. 前提条件 2.安装Distrod 3. 常见问题 3.1.docker compose 问题无法使用问题 3.1. docker-compose up报错 参考文档 1. 前提条件 win10 WSL2 Ubuntu(截止202308最新版本是20.04.xx) 有不少的博客都是建议直接安装docker desktop,这样无论在windows…

C#开发的OpenRA游戏之世界存在的属性(1)

C#开发的OpenRA游戏之世界存在的属性(1) 在游戏里,由于存在雷达,那么每个物品就可以在雷达上显示出来,但是雷达上显示不同的部分物品时,会采用不同的颜色来显示,那么它又是怎么样实现这种不同物品进行不同的颜色显示呢? 可以仔细观看下图: 可以看到矿产显示为绿色,…

C语言之文件操作(剩余部分)

上篇博客字数到极限了,给大家把内容补充在这一篇,我们还剩下文件读取结束的判定和文件缓冲区的内容没有介绍,让我们开始下面的学习吧! 目录 1.文件读取结束的判定 1.1feof函数 1.2ferror函数 代码示例 2.文件缓冲区 2.1fflu…

Android T 实现简易的 USB Mode Select 需求

Android T 实现 USB Mode Select 需求 一、实现效果 二、主要实现思路 在手机连接 USB 发生/取消通知的同时,控制弹窗 Dialog 的显示/消失。 三、主要代码实现 连接 USB 发送/取消的主要实现是在 UsbDeviceManager.java 类中。类路径如下: system/f…

《持续交付:发布可靠软件的系统方法》- 读书笔记(十二)

持续交付:发布可靠软件的系统方法(十二) 第 12 章 数据管理12.1 引言12.2 数据库脚本化12.3 增量式修改12.3.1 对数据库进行版本控制12.3.2 联合环境中的变更管理 12.4 数据库回滚和无停机发布12.4.1 保留数据的回滚12.4.2 将应用程序部署与数…

Vue集成海康websdk实现摄像头预览

选择以及下载相应的websdk: 从海康开放平台下载相应的sdk,web3.0不支持高版本浏览器,web3.2需要摄像头支持摄像头取流,web3.3支持高版本浏览器 我这选择的是3.3的。可以先测试下开发包是否可以成功访问,修改用ip、户名…

visual studio 启用DPI识别功能

在开发widow程序时,有时必须将电脑 设置-->显示-->缩放与布局-->更改文本、应用项目的大小-->100%后,程序的画面才能正确运行,居说这是锁定了dpi的原因,需要启dpi识别功能。设置方法如下: 或者

ubuntu 16.04.5 安装 vivado 2019.1 完整编译AD9361的环境

一、前期安装 1、安装ncurses库(已经包含了,其他的os需要安装) sudo apt install libncurses5二、安装 sudo ./xsetup使用lic进行激活。 三、安装后 输入指令 sudo gedit ~/.bashrc 末尾添加 source /opt/Xilinx/Vivado/2019.1/setti…

防火防盗防小人 使用 Jasypt 库来加密配置文件

⚔️ 项目配置信息存放在哪? 在日常开发工作中,我们经常需要使用到各种敏感配置,如数据库密码、各厂商的 SecretId、SecretKey 等敏感信息。 通常情况下,我们会将这些敏感信息明文放到配置文件中,或者放到配置中心中。…

论文速览 | arxiv 2023, 马氏距离感知训练在分布外检测中的应用

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文。 OOD论文速览 | arxiv 2023, Mahalanobis-Aware Training for Out-of-Distribution Detection 该论文旨在提出一种改进的深度学习模型训练方法,以提高对分布外(OOD)样本的检测能力。…

小米智能电视投屏方法

小米智能电视也提供了投屏功能。 使用遥控器,在应用中找到它,点击进入。 小米电视支持windows笔记本,macbook笔记本,iphone手机,安卓手机投屏。 windows笔记本投屏 在投屏应用中找到windows投屏,选中开…

【经验模态分解】4.信号由时域向频域的转换

/*** poject 经验模态分解及其衍生算法的研究及其在语音信号处理中的应用* file 傅里叶变换与小波变换* author jUicE_g2R(qq:3406291309)* * language MATLAB* EDA Base on matlabR2022b* editor Obsidian(黑曜石笔记软件&#…

亚马逊云科技实时 AI 编程助手 Amazon CodeWhisperer,开发快人一步!

近年来,随着 AI 技术的进步、基础设施建设的不断完善,AI 应用场景不断丰富,各类 AI 产品和工具层出不穷。其中,面向开发者的 AI 编程工具也在不断迭代,并因宣称能“帮开发者写代码”而引发关注。目前,可以为…

喜报!华为云金融PaaS3.0荣获“2023年应用现代化典型案例”称号

中国软件行业协会近期启动了2023“应用现代化产业实践”优秀案例征集活动,旨在加快推动应用现代化发展与推广应用,形成行业应用带动和示范作用,打造应用现代化软件名企、名品,凝聚行业资源,助力我国行业应用现代化高质…

使用jdk21预览版 --enable-preview

异常 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project sb3: Compilation failure [ERROR] --enable-preview 一起使用时无效 [ERROR] (仅发行版 21 支持预览语言功能) 解决…

MIPI配置的OV5640的使用

MIPI摄像头的数据输入FPGA的数据流: N Lane 差分串行输入 ————串转并模块 ————字节对齐处理 ————Lane同步处理处理 ————逆转LLP:Unpacked 处理 ————Byte转Pixel处理 此后写入Wfifo并且存入DDR3。

thinkphp6 起步

1、安装 composer create-project topthink/think6.0 tp62、使用多应用模式,你需要安装多应用模式扩展think-multi-app composer require topthink/think-multi-app3、config/app.php中,将 ‘auto_multi_app’ > flase, 改为true; 需要自…

MySQL-基础篇

文章目录 第一章 MYSQL 概述数据库相关概念MySQL 数据库下载安装启动和停止 MySQL客户端连接解决:mysql 不是内部或外部命令,也不是可运行的程序或批处理文件。配置 Path 环境变量解决:net start mysql80 发生系统错误 5。 拒绝访问。MYSQL 的…

Java自学第8课:电商项目(3) - 重新搭建环境

由于之前用的jdk和eclipse,以及mysql并不是视频教程所采用的,在后面运行源码和使用作者提供源码时,总是报错,怀疑: 1 数据库有问题 2 jdk和引入的jar包不匹配 3 其他什么未知的错误? 所以决定卸载jdk e…

STM32C8T6实现微秒延时函数delay_us

/* USER CODE BEGIN 0 */ void delay_us(uint32_t ii) {uint32_t temp;SysTick->LOADii*8;SysTick->VAL0x00;SysTick->CTRL0x01;//2号位1使用内核时钟do{tempSysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));SysTick->CTRL0X00;SysTic…
最新文章