Linux编辑器-gcc的使用

news2024/11/17 3:03:56

一:背景知识


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++ 的静态库,可以使用以下命令:

 安装成功如下:


 

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

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

相关文章

解决ModuleNotFoundError: No module named ‘diffusers.models.cross_attention‘

目录 项目场景: 问题描述 原因分析: 解决方案: 方案一:

如何取消显示Notepad++每行显示的CRLF符号

新电脑中重新安装了Nodepad,打开记事本后发现出现了许多黑底的CR|LF标记,特别碍眼。 如何取消呢? 视图 -> 显示符号 -> 取消勾选 显示行尾符操作步骤 预期效果

秦丝9周年 | 各行业实体生意如何实现数字化转型?

近期,北京、深圳、天津、重庆等全国27个省都在推进“一刻钟便民生活圈”——以社区居民为服务对象,在步行15分钟左右的范围内,满足居民日常生活基本消费和品质消费。 而各行业的实体店是这个“圈”中的重要组成部分,很多入驻的实…

jupyter notebook进不去指定目录怎么办?

首先激活你要使用的虚拟环境 刚开始是现在 (base) C:\Users\lenovo>目录下 直接输入你想进入的盘 (base) C:\Users\lenovo>e:此时再cd (base) C:\Users\lenovo>cd E:\tim\learn_pytorch 就可以进入了 安装3.4.1.15问题 已经有了最新python版本的虚拟环境&#…

6-1 汉诺塔

汉诺(Hanoi)塔问题是一个经典的递归问题。 设有A、B、C三个塔座;开始时,在塔座A上有若干个圆盘,这些圆盘自下而上,由大到小地叠在一起。要求将塔座A上的圆盘移到塔座B上,并仍按同样顺序叠放。在…

微服务是个坏主意吗?

曾几何时,我记得我的手指疯狂地敲打键盘,与庞大而杂乱的代码库搏斗。那是巨石的时代,代码就像古老的城堡一样,由一块块石头砌成一个令人印象深刻的庞然大物。 几年过去了,时代变了。开发人员口中的流行语变成了“微服…

TS同时打包和监视所有ts文件或只指定ts文件

当我们项目中ts文件较多时,我们如何直接打包所有ts文件为js文件?而不是使用tsc 文件名 一个一个去打包文件 一、配置tsconfig.json文件 创建一个tsconfig.json文件,该文件中不需要配置任何信息 二、控制台输入打包命令 在控制台输入如下代…

手机机型响应式设置2

window.screen.height:屏幕高度 window.innerHeight:视口高度(去除浏览器头尾的高度) document.body.clientHeight:内容高度 vh:网页视口高度的1/100 vw:网页视口宽度的1/100 vmax&#xff…

2万多条汉字笔画笔顺查询ACCESS\EXCEL数据库

发现很多新华字典类的数据都没有笔顺的相关数据,因此就找了一下笔顺查询相关,发现有两个模式,一种是每个字每个笔画都有一张图片(很庞大的图片数据量);一种是笔画图片文件显示型,比如今天采集的…

Vue的详细教程--基础语法【下】

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Vue的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.事件处理器 ①.stop ②.prevent ③.on…

消费盲返模式:一种让消费者和商家都受益的新型消费返利模式

消费盲返是一种新型的消费返利模式,它的核心思想是:消费者在平台购买商品后,可以获得后续一定数量的订单的部分利润作为奖励。这样,消费者不仅可以享受商品的优惠,还有可能赚取更多的钱。 这种模式对于平台和消费者都有…

WorkPlus | 好用、专业、安全的局域网即时通讯及协同办公平台

自国家于2022年发布的《关于加强数字政府建设的指导意见》以来,我国数字政府建设已经迈入了一个全新的里程碑,迎来了全面改革和深化升级的全新阶段。 WorkPlus作为自主可控、可信安全、专属定制的数字化平台,扮演着政务机关、政府单位以及各…

mysql 导入sql文件

mysql 导入sql文件 sudo mysql -uroot -p123456 -h127.0.0.1 sudo mysql -uroot -p123456 -h127.0.0.1然后 show databases;然后 use 数据库名称; 然后 source 20230920031001.sql;如果不加 -h127.0.0.1 可能会出现错误 /var/lib/mysql.sock error 通过 navicat导入的话&am…

英语——分享篇——每日100词——201-300

chess——che车(拼音)ss两个美女(编码)——车里有两个美女在下国际象棋 April——ap阿婆(拼音)ri日(拼音)l棍子(编码)——四月份阿婆每日拿着棍子 palace——place地方——这个地方是宫殿 bottle——bo60(象形)ttle太太乐(拼音)——有60颗太太乐鸡精在瓶子里

VVICAPI接口解析,实现根据ID取商品详情

VVICAPI是一个虚构的API接口名称,我无法提供具体的VVICAPI接口解析。但是,我可以向您展示一般的API接口使用方法,以及如何根据ID获取商品详情的示例代码。 假设您有一个名为"VVICAPI"的接口,并且您已经获得了访问该接口…

epoll的并发服务器(TCP服务器与客户端通信)

服务器&#xff1a; #include<myhead.h> #define IP "192.168.250.100" #define PORT 8888 /* typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64; } epoll_data_t;struct epoll_event {uint32_t events; …

使用vmware安装虚拟机时“出现此主机支持Intel VT-x,但Intel VT-x处于禁用状态”。

1、出现问题 使用vmware安装虚拟机时“出现此主机支持Intel VT-x&#xff0c;但Intel VT-x处于禁用状态”。 已将该虚拟机配置为使用 64 位客户机操作系统。但是&#xff0c;无法执行 64 位操作。 此主机支持 Intel VT-x&#xff0c;但 Intel VT-x 处于禁用状态。 如果已在 BI…

JPA的注解@Field指定为Keyword失败,导致查询不到数据

一、背景 使用 jpa 对es操作&#xff0c;查询条件不生效&#xff0c;需求是批量查询课程编号。说白了&#xff0c;就是一个In集合的查询。在es里&#xff0c;如果是精准匹配是termQuery&#xff0c;比如&#xff1a; queryBuilder.filter(QueryBuilders.termQuery(“schoolId…

【Vue】路由与Node.js下载安装及环境配置教程

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

Python之列表

标题 列表什么是列表列表的创建列表的删除列表的访问 列表的常用方法append()、insert()、extend()pop()、remove()、clear()count()、index() 列表支持的运算加法运算符乘法运算符*成员测试运算符in 内置函数对列表的操作列表推导式 切片操作&#xff08;1&#xff09;使用切片…