当前位置: 首页 > news >正文

Linux编辑器-gcc的使用

一:背景知识


1.预处理(头文件展开、去注释、宏替换、条件编译)

2.编译(由C生成汇编)

3.汇编(生成及其可识别代码)

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


二:gcc实现过程

1.预处理


预处理对应的指令为:

gcc -E test.c -o test.i

-E表示从现在开始,进行程序的翻译,等预处理做完就停下来,不在继续。

-o 要形成的目标文件

test.i 表示(预处理的结果)显示在该文件中。 


预处理主要进行的工作为:头文件展开、去注释、宏替换、条件编译。

我们以下述代码,对前三个进行测试:

 经过预处理之后,如下图所示:

接下来,我们对条件编译进行测试,测试示例及其结果如下:

 

由上述图可知:通过条件编译,可以实现对代码的动态裁剪。 

 2.编译


编译对应的指令为:

gcc -S test.i -o test.s

-S 从现在开始,进行程序的翻译,等编译工作做完,就停下来。

test.s 显示在该文件中。


3.汇编 


汇编对应的指令为:

gcc -c test.s -o test.o

-c 可以将汇编代码转为“.o”的二进制目标代码 


打开test.o文件: 

在此处 文件显示乱码,原因是 test.o 已经是一个二进制的文件了。

但是我们有一个指令可以用于查看二进制文件:

od test.o

 但是我们打开之后,也还是看不懂。

4.连接


连接对应的指令为:

gcc test.o -o mybin

连接形成了可执行程序。

运行mybin

 ./mybin

5.函数库


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

系统把这些函数实现都被做到名为 libc.so.6 的库文件中。
我们的代码 + 头文件 + 库 = 我们的可执行程序
头文件和库文件都是文件!
所以所谓的开发环境安装一定要做什么工作???怎末理解???
安装下载并拷贝头文件和库文件到开发环境的特定路径下,一定要能被编译器自己找到。

函数库一般分为静态库和动态库(居多)两种。 

动态库一般后缀名为“.so”,静态库后缀名一般为“.a”

6.动态库 vs 静态库


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

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


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

静态链接:等价于将电脑搬回宿舍,随时都可以用,不需要去网吧。


动态链接的优缺点

优点:形成的可执行程序体积比较小,节省资源

缺点:一旦缺失,会影响使用该动态库的所有程序 

静态链接的优缺点

优点:无视库,可以独立运行

缺点:体积太大,浪费资源


gcc 默认动态链接

如果我们需要安装 C/C++ 的静态库,可以使用以下命令:

 安装成功如下:


 

相关文章:

Linux编辑器-gcc的使用

一:背景知识 1.预处理(头文件展开、去注释、宏替换、条件编译) 2.编译(由C生成汇编) 3.汇编(生成及其可识别代码) 4.连接(生成可执行文件或库文件) 二:gcc…...

第16篇ESP32 platformio_arduino框架 wifi联网_连接WiFi热点并连接tcp server收发数据进行通讯

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…...

day1| 704. 二分查找、27. 移除元素

704. 二分查找 题目链接:https://leetcode.cn/problems/binary-search/ 文档讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html 视频讲解:https://www.bilibili.com/video/BV1fA4y1o715 1、二分法的前提 这道…...

R绘制箱线图

代码大部分来自boxplot()函数的帮助文件,可以通过阅读帮助文件,调整代码中相应参数看下效果,进而可以理解相应的作用,帮助快速掌握barplot()函数的用法。 语法 Usage(来自帮助文件) barplot(height, ...)## Default S3 method: …...

利用Audit审计系统行为

标题利用Audit审计系统行为 Linux Audit守护进程是一个可以审计Linux系统事件的框架 这个框架本身有数个组件,包括内核、二进制文件及其他文件。 1.内核audit:钩在内核中来捕获事件并将它们发送到auditd。 2.二进制文件 auditd:捕捉事件并…...

uniapp:不同权限设置不同的tabBar

1、在pages.json里,将所有tabBar涉及的页面都加进来。 我这里使用username来动态显示tabBar。 jeecg用户显示:首页,订单,消息,发现,我的,一共5个tabBar。 admin用户显示:首页&…...

如何将本地的项目上传到Git

一、GitHub or GitLab or Gitee创建一个新的仓库 二、仓库路径创建成功后,将本地项目上传到git 1. 进入本地项目所在文件夹位置,右击 2.出现git命令框 输入git init 在当前项目的目录中生成本地的git管理(会发现在当前目录下多了一个.git文件…...

[php] 文件上传的一个项目emmm

项目完整地址 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>上传文件</title><link href"./css/bootstrap.min.css" rel"stylesheet"><style>font-face {fo…...

uniapp-时间格式和距离格式的转换

时间格式的转换 第一种是把 YYYY-MM-DD hh:mm:ss 转换成 MM月DD日 第二种是把 hh:mm:ss 转换成 hh:mm /*** 格式化时间 1* 把传入的完整时间分为 MM月DD日 的格式* returns*/ export function formatDate(timeStr) {const date new Date(timeStr);const month (date.ge…...

【卖出备兑看涨期权策略(Covered_call)】

卖出备兑看涨期权策略&#xff08;Covered_call&#xff09; 卖出备兑看涨期权策略是一种最基本的收入策略&#xff0c;该策略主要操作就是在持有标的资产的同时卖出对应的看涨期权合约&#xff0c;以此来作为从持有的标的资产中获取租金的一种方法。如果标的资产的价格上涨到…...

【校招VIP】测试算法考点之智力分析

考点介绍&#xff1a; 智力题(逻辑分析题&#xff09;准备校招的同学们好好准备下,测试笔试中经常遇到。 测试算法考点之智力分析-相关题目及解析内容可点击文章末尾链接查看&#xff01; 一、考点试题 1.5个囚犯在装有100颗豆子的袋子里摸,他们谁的存活几率大? 5个囚犯,分…...

【Linux 服务器运维】定时任务 crontab 详解 | 文末送书

文章目录 前言一、crontab 介绍1.1 什么是 crontab1.2 crontab 命令工作流程1.3 Linux 定时任务分类 二、crontab 用法详解2.1 crond 服务安装2.2 crontab 文件内容分析2.3 crontab 命令用法2.3.1 查看定时任务列表2.3.2 编辑/创建定时任务2.3.3 删除定时任务2.3.4 其他 cronta…...

Vue系列之入门篇

前言&#xff1a; 目录 一&#xff0c;关于Vue的简介 1.什么是Vue&#xff1f; 2.使用Vue框架的好处&#xff1f; 3. 库和框架的区别&#xff1a; 4. MVVM的介绍 5.Vue的入门案例 二&#xff0c;Vue的生命周期 一&#xff0c;关于Vue的简介 1.什么是Vue&#xff1f; Vu…...

【遥感卫星数据】Landsat数据Collection1和Collection2区别

文章目录 1 总体介绍2 Landsat Collection 13 Landsat Collection 23.1 Collection 2 Level-1产品3.2 Collection 2 Level-2产品参考资料1 总体介绍 Landsat卫星的产品数据每经过几年就会有一次改进,主要改进几何校正精度和辐射纠正精度。而且NASA/USGS每次更新产品都会把存档…...

socket() failed (24: Too many open files) while connecting to upstream, client

一、这个错误通常是因为文件句柄数目超过系统限制导致的。要解决这个问题&#xff0c;您可以尝试以下几个步骤&#xff1a; 调整系统文件句柄限制&#xff1a;您可以通过修改/etc/security/limits.conf文件中的nofile参数来增加系统文件句柄的最大数目。将nofile的值增加到更高…...

认识单链表

-之前我们学过储存数据的一种表——顺序表&#xff0c;那么为什么还有链表呢 首先我们回顾一下顺序表 顺序表是物理地址连续的一段内存空间&#xff08;数组&#xff09;&#xff0c;我们通过动态内存开辟的&#xff0c; 那么&#xff1a; 顺序表也有自己的一些优点&#xff0c…...

pytest(二)框架实现一些前后置(固件,夹具)的处理,常用三种

为什么需要这些功能&#xff1f; 比如&#xff1a;web自动化执行用例前是否需要打开浏览器&#xff1f;执行用例后需要关闭浏览器&#xff1f; 示例代码&#xff1a; import pytest class Testcase:#这是每条测试用例执行前的初始化函数def setup(self):print("\n我是每…...

【计算机网络 - 自顶向下方法】计算机网络和因特网

目录 1. What is the Internet? 1.1 因特网的具体构成 1.2 因特网的功能 2. Network core 2.1 基本介绍 2.2 分组交换 2.2.1 序列化时延 2.2.2 排队延迟和丢包 2.2.3 分组交换的优缺点 2.3 电路交换 2.3.1 基本概念 2.3.2 电路交换网络中的复用 2.3.3 电路交换文件…...

【Java 基础篇】Java Condition 接口详解

Java 提供了一种更灵活和高级的线程协作机制&#xff0c;通过 Condition 接口的使用&#xff0c;你可以更精细地控制线程的等待和唤醒&#xff0c;实现更复杂的线程同步和通信。本文将详细介绍 Java 的 Condition 接口&#xff0c;包括它的基本概念、常见用法以及注意事项。 什…...

.360勒索病毒和.halo勒索病毒数据恢复|金蝶、用友、ERP等数据恢复

导言&#xff1a; 随着数字化时代的持续发展&#xff0c;网络安全威胁也变得前所未有地复杂和难以应对。在这个充满挑战的网络环境中&#xff0c;勒索病毒已经成为了一种极为危险和破坏性的威胁。最近引起广泛关注的是.360勒索病毒&#xff0c;一种可怕的恶意软件&#xff0c;…...

移动通信浪潮如何重塑半导体产业格局:从高通与英特尔市值对比说起

1. 从市场估值看产业浪潮&#xff1a;移动通信如何重塑半导体格局2013年春天&#xff0c;一则消息在半导体和投资圈内引发了不小的震动&#xff1a;无线通信芯片巨头高通&#xff08;Qualcomm&#xff09;的市值&#xff0c;悄然与行业传统霸主英特尔&#xff08;Intel&#xf…...

ElevenLabs Enterprise方案深度拆解:从API限流策略到GDPR语音数据主权管理的7层安全加固实践

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs Enterprise方案全景概览 ElevenLabs Enterprise 是面向中大型组织构建的语音合成与语音识别一体化平台&#xff0c;专为高并发、多租户、合规性敏感场景设计。其核心能力覆盖实时TTS流式输出…...

别再死记硬背关键帧了!用Blender 2.83.9的Rigify,带你拆解走路动画的物理原理(附膝跳问题修复)

别再死记硬背关键帧了&#xff01;用Blender 2.83.9的Rigify&#xff0c;带你拆解走路动画的物理原理&#xff08;附膝跳问题修复&#xff09; 当你第一次尝试用Blender制作走路动画时&#xff0c;是否遇到过这样的困境&#xff1a;明明按照教程一步步设置了关键帧&#xff0c;…...

C语言打印三角形别再只会用*了!用字母、数字、符号玩出新花样(附完整代码)

C语言打印三角形&#xff1a;用字母、数字和符号玩转循环艺术 在C语言入门阶段&#xff0c;打印三角形几乎是每个初学者必经的练习。但你是否已经厌倦了千篇一律的星号(*)图案&#xff1f;今天&#xff0c;我们将打破常规&#xff0c;探索如何用字母、数字和各种符号来创造独特…...

喜马拉雅音频下载终极指南:如何永久保存付费专辑到本地

喜马拉雅音频下载终极指南&#xff1a;如何永久保存付费专辑到本地 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 还在为喜马拉雅…...

新手也能看懂的SQL注入绕过实战:以BUUCTF的BabySQL靶场为例,手把手教你双写绕过

从零破解BabySQL&#xff1a;双写绕过的艺术与科学 当你第一次接触CTF比赛中的SQL注入题目时&#xff0c;那种既兴奋又困惑的感觉一定记忆犹新。面对BabySQL这样的靶场&#xff0c;新手常会遇到一个典型困境&#xff1a;明明知道应该用union select来获取数据&#xff0c;却发现…...

利用大模型分歧优化NLP标注

In this blogpost I’d like to talk about large language models. There’s a bunch of hype, sure, but there’s also an opportunity to revisit one of my favourite machine learning techniques: disagreement. 在本文中&#xff0c;我想讨论大语言模型。虽然存在大量炒…...

【Sora 2×AE工作流革命】:20年特效总监亲授无缝整合5大黄金法则,错过再等三年?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Sora 2AE工作流革命的底层逻辑与行业拐点 Sora 2AE&#xff08;Advanced Encoding&#xff09;并非简单升级&#xff0c;而是将扩散模型时序建模能力与自适应编码器深度耦合的范式重构。其核心突破在于…...

边缘计算实战:基于 Linux Netns 与标准海事网关抵御局域网横向攻击的物理隔离架构

摘要&#xff1a;扁平化局域网极易遭受 ARP 欺骗与黑客横向攻击。本文记录了在标准工业级海事网关上基于 Linux netns 构建网络物理与逻辑隔离防线的实操复盘。 导语&#xff1a;在实操一个远洋船载网络的安全重构项目时&#xff0c;我们面临一个极其严峻的威胁模型&#xff1…...

别再死记硬背了!Vivado伪双口RAM的wea/ena信号,这次用仿真波形给你讲透

深入解析Vivado伪双口RAM控制信号&#xff1a;从波形图看wea/ena关键设计 在FPGA开发中&#xff0c;存储器设计一直是性能优化的关键环节。Xilinx Vivado工具链提供的伪双口RAM IP核因其灵活性和高效性&#xff0c;成为许多高速数据处理系统的首选方案。然而&#xff0c;不少开…...