Linux小组件:gcc

gcc

是C语言的编译器,在Linux下我们也用这个编译C语言

 安装gcc

sudo apt install build-essential

查看gcc版本信息

gcc --version

有时候会出现代码编译不过去的问题,通常可能是gcc的编译标准太低,不支持某些写法

比如在很多旧的编译标准下C语言for循环内不能定义变量

在Linux下输入这个就可以给目标文件改变编译标准

gcc test.c -std=c99

gcc的相关命令的格式是:gcc [options] [filenames]

输入

gcc 文件名  -o 新文件名

可以命名新生成的可执行文件,源码存的文件必须后缀名是.c,不然就会这样

这是正常编译捏

我们也可以通过指令看编译的四个过程:预处理,编译,汇编,链接

【ᐖ】编译器和解释器-CSDN博客

-E仅执行预处理,不进行编译、汇编和链接(生成后缀为 .i 的预编译文件)
-S执行编译后停止,不进行汇编和链接(生成后缀为 .s 的预编译文件)
-c编译程序,但不链接成为可执行文件(生成后缀为 .o 的文件)

预处理

生成后缀为i的预编译文件

​gcc -E TAT.c -o TAT.s

打开看就长这样,这些多出来的东西都是把头文件从库函数引入;头文件不见了,多出来的东西都来自于<stdio.h>

这是打开的头文件库

为了对比预编译的文件和源码的区别,我们进入vum的分屏模式

vs test.i //底行模式

红圈圈住的部分不全,总之红圈部分就是引入的头文件库,你会发现左屏的头文件不见了(惊讶

看看我们的编译文件

编译过程

看看我们的汇编文件

 gcc -c TAT.c -o TAT.o

这个.o文件,后缀全称是.obj,是二进制指令文件,不是可执行文件

链接

链接形成可执行程序(程序和库结合的过程)

gcc test.o -o my.exe

链接就是程序里的内容对库的调用。一个语言在发明的时候要有自己的语法和库,库里有很多现成的东西,可以被调用。

查看你的文件链接的库

ldd my.exe

系统下的一个二进制库承装了很多方法: 

ls /lib64/libc.so.6 -l

这个库的真实名字是掐头(去掉lib)去尾(去掉.so.6)就是它的真名:C

库有动态库和静态库之分

Linux下的动态库后缀名是.so,静态库是.a

Windows下的动态库是.dll,静态库是.lib

 在链接的时候出错可能是库被误删了

目标文件要连接库,编译器告诉目标文件库的地址,目标文件在库里面找自己需要的方法,叫跳转到相应库执行;使用里面的方法再生成出可执行代码。整体的过程从编译器告诉地址开始,连接在编译的时候已经开始了,整体是动态运行的。库会跑来跑去,找库的时候就叫动态链接共享动态库,但是一旦动态库缺失,所有的动态链接这个库的程序都无法执行了(动态链接很依赖共享动态库

于是另一种链接方式:静态链接,就是在库里找到方法后,直接把方法带回去。在编译的时候,将库中的方法拷贝到自己的可执行程序


动态库优缺点

1.不能丢失

2.节省资源(静态链接重复率很高)

静态库优缺点 

1.一旦形成,和库无关

2.浪费资源

在Linux上,一般静态库是默认没有安装的

安装静态库:

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


静态链接应用场景:把需要的库拷贝到可执行程序(不依赖库),具有跨平台性

总结:选项:-ESC ,后缀名iso

计算机语言发展

在计算机语言发展过程,人们一直都在用二进制编程。就像纸带八音盒一样,在纸带上打孔,有孔就是1,没孔就是0

后来有了汇编语言, 面向机器的语言设计,他只是将机器语言做了简单编译,所以并没有根本上解决机器语言的特定性

后来发明了C语言,更适合两脚兽使用的语言,但是机器又看不懂,于是就需要编译,于是就有了编译器,把C语言翻译为汇编语言然后翻译成机器语言

编译器也是一款软件,比如我们的gcc在使用的时候需要先安装它。一般一开始我们的编译器是由二进制编写的汇编编译器。但是二进制维护性低下,所以就用汇编语言重新写新编译器,汇编语言写的编译器来编译汇编语言,就形成了新的编译器,才算比较完备了。就好像golang与语言一开始只是对C语言做了小改动,直到go语言自己也可以用go来写才算成熟

维护代码

在公司里大家合作做一个项目时,需要共同维护代码。那么我们是每人一份代码维护还是共同维护同一份代码?

如果大家各自维护,我们就需要将bug解决维持实时同步,每份代码都要测试一次,成本耗时都高。所以只需要维护一份代码就好。

我们的代码

#include<stdio.h>
int main()
{
#ifdef v1printf("功能1\n");
#elif v2 printf("功能1\n");printf("功能2\n");
#elseprintf("功能1\n");printf("功能2\n");printf("功能3\n");printf("功能4\n");printf("功能5\n");
#endifreturn 0;
}  

我们的代码,更改了用户宏定义;define v2 1,默认会走第二个分支

#include<stdio.h>
#define v2 1
int main()
{
#ifdef v1printf("功能1\n");
#elif v2 printf("功能1\n");printf("功能2\n");
#elseprintf("功能1\n");printf("功能2\n");printf("功能3\n");printf("功能4\n");printf("功能5\n");
#endifreturn 0;
}

所以结果不同,这样就实现了动态裁剪,采用条件编译的方式将代码共同的部分保留,不同的部分进行动态裁减。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL注入实例(sqli-labs/less-4)

0、初始页面 1、确定闭合符号 前两条判断是否为数值型注入&#xff0c;后两条判断字符型注入的闭合符号 ?id1 and 11 ?id1 and 12 ?id1" ?id1") 2、确定表的列数 ?id1") order by 3 -- 3、确定回显位置 ?id-1") union select 1,2,3 -- 4、爆库…

【kali靶机之serial】--反序列化漏洞实操

kali靶机配置 【我图片里没有截图的默认配置即可】需要改的地方图片里面都有。 使用kali扫描网关的主机。 扫到一个开放了80端口HTTP协议的主机ip 访问80端口 会看到一个文本页面&#xff0c;翻译一下看是什么意思。。 F12查看cookie&#xff0c;是一个base64编码了的东西 使…

新手小白学习PCB设计,立创EDA专业版

本教程有b站某UP主的视频观后感 视频链接&#xff1a;http://【【教程】零基础入门PCB设计-国一学长带你学立创EDA专业版 全程保姆级教学 中文字幕&#xff08;持续更新中&#xff09;】https://www.bilibili.com/video/BV1At421h7Ui?vd_sourcefedb10d2d09f5750366f83c1e0d4a…

指标一致化处理

什么是数据指标 数据指标有别于传统意义上的统计指标&#xff0c;它是通过对数据进行分析得到的一个汇总结果&#xff0c;是将业务单元精分和量化后的度量值&#xff0c;使得业务目标可描述、可度量、可拆解。 数据指标有哪些类型 极大型:期望取值越大越好&#xff1b; 极小…

Memcached未授权访问漏洞

Memcached 是一套常用的 key-value 分布式高速缓存系统&#xff0c;由于 Memcached 的安全设计缺陷没有权限控制模块&#xff0c;所以对公网开放的Memcache服务很容易被攻击者扫描发现&#xff0c;攻击者无需认证通过命令交互可直接读取 Memcached中的敏感信息。 app"Mem…

AI电销机器人的效果与作用

ai电销机器人的工作效率是非常高的&#xff0c;电销机器人一天的外呼量至少是3000左右&#xff0c;工作效率是人工的十倍还多&#xff0c;并且电销机器人没有负面情绪&#xff0c;一直都可以保持高昂的工作热情&#xff0c;非常简单方便。 并且ai电销机器人是越用越聪明的&…

英国AI大学排名

计算机学科英国Top10 “计算机科学与信息系统”学科除了最受关注的“计算机科学”专业&#xff0c;还包括了“人工智能”“软件工程”“计算机金融”等众多分支专业。 1.帝国理工学院 Imperial College London 单以计算机专业本科来讲&#xff0c;仅Computing这个专业&#x…

来点八股文(五) 分布式和一致性

Raft raft 会进入脑裂状态吗&#xff1f;描述下场景&#xff0c;怎么解决&#xff1f; 不会。raft通过选举安全性解决了这个问题&#xff1a; 一个任期内&#xff0c;follower 只会投票一次票&#xff0c;且先来先得&#xff1b;Candidate 存储的日志至少要和 follower 一样新…

用uniapp 及socket.io做一个简单聊天app 4

界面如下&#xff1a; <template><view class"container"><input v-model"username" placeholder"用户名" /><input v-model"password" type"password" placeholder"密码" /><butto…

comfyUI-MuseTalk的参数设置

comfyUI-MuseTalk的参数设置 目录 comfyUI-MuseTalk的参数设置 一、ComfyUI-VideoHelperSuite 二、comfyUI-MuseV合成的参考视频 2.1、什么时候会用到MuseV&#xff1f; 2.2、MuseV特别消耗系统内存 2.2.1、测试图片序列的像素比 2.2.2、影响运动范围和生成结果的参数 …

Yarn:一个快速、可靠且安全的JavaScript包管理工具

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;还请三连支持一波哇ヾ(&#xff20;^∇^&#xff20;)ノ&#xff09; 目录 一、Yarn简介 二、Yarn的安装 1. 使用npm安装Yarn 2. 在macOS上…

基于Springboot的个人博客系统

文章目录 介绍访问地址一、功能展示1.前台首页归档相册留言关于我登陆注册 2.后台管理系统登陆页面首页文章管理相册管理写博客访客统计 介绍 基于Java&#xff08;Springboot&#xff09;可以用做毕业设计的个人博客系统&#xff0c;包括网站前台和后台管理系统两部分。网站前…

C++中const关键字的用法

C语言和C中const的不同 首先我们需要区分一下C语言中的const和C中的const&#xff0c;C语言中的const修饰的变量可以不初始化&#xff0c;但如果将一个变量定位为const类型还不初始化&#xff0c;那么之后就不能对这个变量直接赋值了。 如果我们使用C语言中的const定义的变量指…

c++ 21 指针

*像一把钥匙 通过钥匙去找内存空间 间接修改内存空间的值 不停的给指针赋值 等于不停的更改指针的指向 指针也是一种数据类型 指针做函数参数怎么看都不可以 指针也是一个数据类型 是指它指向空间的数据类习惯 作业 野指针 向null空间地址copy数据 不断改变指针指向 …

将本地微服务发布到docker镜像二:

上一篇文章我们介绍了如何将一个简单的springboot服务发布到docker镜像中&#xff0c;这一篇我们将介绍如何将一个复杂的微服务&#xff08;关联mysql、redis&#xff09;发布到docker镜像。 我们将使用以下两种不同的方式来实现此功能。 redis、mysql、springboot微服务分开…

Redis未授权访问漏洞 *

#安装redis apt-get install redis #redis链接 redis-cli -h 192.168.4.176 -p 6379 #redis常见命令 &#xff08;1&#xff09;查看信息&#xff1a;info &#xff08;2&#xff09;删除所有数据库内容&#xff1a;flushall &#xff08;3&#xff09;刷新数据库&#xff1a;f…

平衡二叉树 - 力扣(LeetCode) C语言

110. 平衡二叉树 - 力扣&#xff08;LeetCode&#xff09;&#xff08;点击前面链接即可查看题目&#xff09; 一、题目 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 是指该树所有节点的左右子树的深度相差不超过 1。 示例 1&#xff1a; 输入&#xff1a;root […

unity拖拽物品遇到的bug及解决思路

记录一下拖拽实现过程中遇到的bug RectTransform 专门用在UI中transform 判断点击是否在UI中 使用这个函数就可以判断点击的是否是UI面板&#xff0c;返回true表明在UI面板中 EventSystem.current.IsPointerOverGameObject()值得一提的是&#xff0c;如果发现了有UI穿透效…

【Material-UI】多选模式(Multiple values)与Autocomplete的高级用法解析

文章目录 一、多选模式的基本用法二、高级用法1. 固定选项&#xff08;Fixed options&#xff09;2. 复选框&#xff08;Checkboxes&#xff09;3. 限制标签显示数量&#xff08;Limit tags&#xff09; 三、性能优化与最佳实践1. 筛选已选项&#xff08;filterSelectedOptions…

乡村振兴建设顶层规划建设方案

数字乡村振兴平台顶层规划方案摘要 1. 政策背景与总体要求 政策背景&#xff1a;党的十九大明确提出实施乡村振兴战略&#xff0c;总体要求包括产业兴旺、生态宜居、乡风文明、治理有效和生活富裕。随后&#xff0c;中央一号文件、乡村振兴战略规划以及十四五规划和2035年远景…