[Linux入门]---Linux编译器gcc/g++使用
文章目录
- 1.背景知识
- 2.gcc如何完成编译运行工作
- 预处理(进行宏替换)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 链接(生成可执行文件)
- 3.函数库
- 动态库
- 静态库
- 动静态库的区别
- 4.gcc选项
1.背景知识
通过前面的学习,我们知道我们的代码变成能运行的可执行程序,要经历以下四个过程:
1.预处理(进行宏替换)
2.编译(生成汇编)
3.汇编(生成机器可识别的代码)
4.链接(生成可执行文件或库文件)
那在Linux
操作系统上gcc
编译器编译运行代码的过程又是怎么样的呢?接下来让我们一起学习吧!
2.gcc如何完成编译运行工作
$ 格式 gcc [选项] 要编译的文件 [选项] [目标文件]
创建mycode.c
文件,写入如下代码:
#include<stdio.h>
#define M 100 int main()
{
#ifdef DEBUG printf("hello debug\n");
#else printf("hello release\n");
#endif // pintf("这是被注释掉的内容\n"); // pintf("这是被注释掉的内容\n"); // pintf("这是被注释掉的内容\n"); // pintf("这是被注释掉的内容\n"); // pintf("这是被注释掉的内容\n"); // pintf("这是被注释掉的内容\n"); printf("hello gcc:%d\n",M); printf("hello gcc:%d\n",M); printf("hello gcc:%d\n",M); printf("hello gcc:%d\n",M); printf("hello gcc:%d\n",M); printf("hello gcc:%d\n",M); printf("hello gcc:%d\n",M); printf("hello gcc:%d\n",M); printf("hello gcc:%d\n",M); printf("hello gcc:%d\n",M); printf("hello gcc:%d\n",M); return 0;
}
指令:
$ gcc -o mycode.exe mycode.c
//-o 可以指定生成可执行文件名称,如果不指定,默认生成a.out可执行文件
代码编译运行的结果为:
预处理(进行宏替换)
预处理指令:
$ gcc -E 源文件 -o 指定预处理文件名
- 预处理阶段是源文件文件转成目标文件
- 选项
-E,
该选项的作用是让gcc
在预处理结束后停止编译过程。 - 选项
“-o”
是指目标文件,如果不带选项“-o”
会预处理的结果放在显示屏上,“.i”
文件为已经过预处理的C原始程序。 - 预处理阶段的主要工作有:a.去注释,b.头文件展开;c.宏替换(不做类型检查);d.条件编译;
输入指令:
$ gcc -E mycode.c -o mycode.i
$ gcc -E mycode.c -o mycode.i -D DEBUG//使用-D选项在外部可定义宏
输入该指令告诉gcc从现在开始程序的翻译,做完预处理工作就停下来,不要继续往下执行了。
输入指令vim mycode.i
查看预处理后的文件
头文件展开:
编译(生成汇编)
输入编译指令:
$ gcc -S mycode.i -o mycode.s
- 编译阶段是把预处理阶段生成的
“.i”
文件转成".s"
目标文件 - 在这个阶段中,
gcc
首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc
把代码翻译成汇编语言。 - 用户可以使用
“-S”
选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
代码运行的结果为:
汇编(生成机器可识别代码)
汇编指令:
$ gcc -c mycode.s -o mycode.o
- 汇编阶段是把编译阶段生成的
“.s”
文件转成".o"
目标文件 - 可使用选项
“-c”
就可看到汇编代码已转化为“.o”
的二进制目标代码了
输入指令的结果为:
mycode.o
为可重定位二进制文件,简称目标文件,Windows
上目标文件为.obj文件
,虽然已经是二进制文件,但是还不可以独立执行,需要经过链接才能执行!
链接(生成可执行文件)
$ gcc mycode.o -o mycode.exe
- 在成功编译之后,就进入了链接阶段,将可重定位二进制文件和库进行链接形成
.exe
可执行文件
3.函数库
函数库概念:
我们的C程序中,并没有定义“printf”
的函数实现,且在预编译中包含的“stdio.h”
中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”
函数的呢?
系统把这些函数实现都被做到名为
libc.so.6
的库文件中去了,在没有特别指定时,gcc
会到系统默认的搜索路径“/usr/lib”
下进行查找,也就是链接到libc.so.6
库函数中去,这样就能实现函数“printf”
了,而这也就是链接的作用!
动态库
windows系统中,动态库以.dll
为后缀的文件,Linux系统,动态库为以.so
为后缀的文件。库的命名规则:“libnameso.XXX"
,name
为库的真正名字,其他为前后缀。
输入指令查找C的标准库:
ls /lib64/libc*
//查找含/lib64/libc的库文件
ls /lib64/libc.so*
//查找动态库文件
输入指令后代码运行的结果:
静态库
windows
系统中,静态库以.lib
为后缀的文件,Linux
系统,静态库为以.a
为后缀的文件。我们的机器上默认只会安装动态库,静态库需要我们手动输入指令安装。
安装C语言静态库指令如下:
//root用户
# yum install -y glibc-static//安装c的静态库
# yun install -y libstdc++-static//安装c++的静态库
//普通用户
$ sudo yum install -y glibc -static
$ yun install -y libstdc++-static
安装完成的结果如下:
查找C语言静态库指令:
$ ls /lib64/libc.a*
输入指令后代码运行的结果:
动静态库的区别
小故事: 网瘾少年需要上网,你有两种方法,一种是跑到网吧上网,而你怎么知道哪里有网吧呢?原来你的好基友曾经告诉你某某路口向东转500米有一家网吧,于是每到放假的时候,你就可以跑到网吧去上网,但天有不测风云,这家网吧的老板没有营业执照被查封了,自此你的上网之路就断了;只好使用另一种方法,你每天上省吃俭用,终于三个月后攒够了钱,去一家二手电脑销售店购买了一台电脑,从此你便过上了自由自在的网民生活,不久后你去的这家二手电脑销售店由于非法经营被查封了,但这已经影响不到你了。
动态链接:.o
文件(网瘾少年)和动态库(网吧)链接,很高效但如果动态库没了,各个程序文件将无法运行,限制性很大;静态链接:.o
文件(网瘾少年)会拷贝(购买)静态库(电脑)到文件中,会占用很大内存、很多时间(费时费钱),但库文件(电脑销售店没了)不存在了,各个程序文件不受影响仍可以正常运行!
生成可执行文件的指令:
$ gcc mycode.c -o mycode.exe//进行动态链接
$ gcc mycode.c -o mycode_static.exe -static//进行静态链接
输入指令后代码运行的结果:
ldd 可执行文件//查找链接的动态库
file 可执行文件名//显示符号链接的文件类型
①在Linux中,编译形成可执行程序,由编译器提供动态库,默认采用动态链接;如果想要以静态链接的方式,生成可执行文件,需要添加
-static
选项;②静态链接生成的可执行文件比动态链接生成的可执行文件大很多。
动静态库区别总结:
①如果没有静态库,不可以使用-static选项进行静态链接;
②如果没有动态库,只有静态库,gcc编译器将会去寻找静态库进行链接;
③gcc默认优先动态链接,-static选项改变的是链接的优先级,使用后所有的链接都为静态链接;
④我们平时写的代码生成可执行文件时,不一定全部是动态链接或静态链接,而极有可能是动态链接和静态链接混合生成可执行文件;
⑤动态链接优点:动态库是共享库,可以有效地节省资源(磁盘空间、内存空间,网络空间等);缺点:动态库一旦缺失,使用动态链接的可执行程序将无法运行!
⑥静态链接的优点:不依赖库,程序可以独立运行;缺点:生成的可执行文件体积大,比较消耗资源(磁盘空间、内存空间,网络空间等)。
4.gcc选项
-E
进行预处理工作,不生成文件,你需要把它重定向输出到一个.i
文件里面
-S
编译到汇编语言到.s
文件中,不进行汇编和链接
-c
进行汇编工作,编译到.o
可重定位二进制目标文件(目标文件)
-o
将目标文件和库文件进行链接输出到指定的可执行文件
-static
此选项对生成的文件采用静态链接-g
生成调试信息。GNU 调试器可利用该信息。
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库
-O0
-O1
-O2
-O3
编译器的优化选项的4个级别,-O0
表示没有优化,-O1
为缺省值,-O3
优化级别最高
-w
不生成任何警告信息。
-Wall
生成所有警告信息。
相关文章:
[Linux入门]---Linux编译器gcc/g++使用
文章目录 1.背景知识2.gcc如何完成编译运行工作预处理(进行宏替换)编译(生成汇编)汇编(生成机器可识别代码)链接(生成可执行文件) 3.函数库动态库静态库动静态库的区别 4.gcc选项 1.…...
[Git入门]---gitee注册及代码提交
文章目录 1.Gitee是什么2.gitee注册3.git工具及图形化界面工具安装4.gitee仓库创建5.进行本地仓库与远端gitee仓库的链接6.git三板斧addcommitpush 7.gitee提交代码常见问题 1.Gitee是什么 gitee是基于git代码托管和研发协作的国内平台,在上面可以托管个人或公司代…...
企业架构LNMP学习笔记46
PHP测试连接代码: php代码测试使用memcached: 示例代码: <?php //实例化类 $mem new memcached(); //调用连接memcached方法 注意连接地址和端口号 $mem->addServer(192.168.17.114,11211); //存数据 var_dump($mem->set(name,l…...
ELFK之zookeeper+kafka
目录 kafkazookeeper的系统架构 Zookeeper 一、zookeeper概述 二、zookeeper特点 三、zookeeper选举机制 四、应用场景 五、zookeeper实验实例 Kafka 一、概述 为什么需要消息队列(MQ) 使用消息队列的好处 消息队列的两种模式 Kafka 定义 二、Kafka 的特性 三、Ka…...
ECharts
ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的…...
jsoup框架技术文档--java爬虫--架构体系
阿丹: 在学习以及认知使用一个新技术之前一定要搞清楚有关框架的架构体系。了解一下该技术的底层会对后面编写代码以及寻找报错都是很有用处的,前期做的铺垫多一点,后期开发的时候就很方便。 jsoup框架的关键组件 JSoup框架的关键组件主要包…...
OpenStack创建云主机并连接CRT
文章目录 OpenStackT版创建云主机并连接CRT命令行操作(1)创建镜像(2)创建实例(3)创建网络创建内网创建外网 (4)创建安全组(5)创建路由(6ÿ…...
linux-sed命令
目录 1.linux-shell sed获取某一段字符串 2.linux-shell shell脚本中 sed -n取出某一行赋给一个变量 3.linux-shell sed查询某一行 1.linux-shell sed获取某一段字符串 如果要获取的是某一段字符串,可以在 sed 命令中使用正则表达式来指定需要获取的字符串。例如…...
Elasticsearch:什么是向量和向量存储数据库,我们为什么关心?
Elasticsearch 从 7.3 版本开始支持向量搜索。从 8.0 开始支持带有 HNSW 的 ANN 向量搜索。目前 Elasticsearch 已经是全球下载量最多的向量数据库。它允许使用密集向量和向量比较来搜索文档。 矢量搜索在人工智能和机器学习领域有许多重要的应用。 有效存储和检索向量的数据库…...
JOSEF约瑟 剩余电流继电器PFR-5 PFE-W-20 国产化改造ZLR-G81 ZCT-45
系列型号: PFR-003剩余电流继电器 PFR-03剩余电流继电器 PFR-5剩余电流继电器 PFR-W-105互感器 PFR-W-140互感器 PFR-W-20互感器 PFR-W-210互感器 PFR-W-30互感器 PFR-W-35互感器 PFR-W-70互感器 一、用途 PFR剩余电流继电器(以下简称继电器…...
分别用Python和Go实现对文件夹及其子文件夹里的文件进行批量重命名
文章目录 问题阐述上代码结果如何 问题阐述 最近在继续提高自己的go技术时,从网上一些平台获取到了一些学习资料,然后下载到本地后,文件的命名是真的像衣托答辩: 除了上述的文件,还有一mol多神奇的命名,害…...
redis深度历险 千帆竞发 —— 分布式锁
分布式应用进行逻辑处理时经常会遇到并发问题。 比如一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作同时进行了,就会出现并发问题,因为读取和保存状态这两个…...
C#根据中文首字母排序
第一种方式: 这种方式会受制于服务器的区域和语言设置。 1.首先添加一个排序类ChineseNameComparer public class ChineseNameComparer : IComparer<string> {public int Compare(string x, string y){if (x null || y null)return 0;var xFirstChar x.Su…...
仪表基础知识培训
压力传感器:E+H PMX5x/FMX5x 一、安装:安装注意事项: 1、水平安装时仪表的呼吸孔(1)需要向下安装,并远离污染物。 2、请勿用坚硬的物体擦拭或接触膜片。 3、请勿安装在水泵的入口和搅拌叶附近 二、供电、接线、信号、:二线制,仪表输出4-20mA 三、量程:设置最大最小量程…...
无涯教程-JavaScript - PI函数
描述 PI函数返回数字3.14159265358979,数学常数pi,精确到15位数字。 语法 PI ()争论 PI函数语法没有参数。 适用性 Excel 2007,Excel 2010,Excel 2013,Excel 2016 Example JavaScript 中的 PI函数 - 无涯教程网无涯教程网提供描述PI函数返回数字3.14159265358979,数学常…...
前端防抖和节流
前端防抖和节流 概述 防抖: 防止抖动,个人字面理解此处防的不是页面的抖动,而是用户手抖。为了防止用户快速且频繁的触发事件而导致多次执行事件函数,这样的场景有很多,比如监听滚动、鼠标移动事件onmousemove、频繁…...
[pai-diffusion]pai的easynlp的clip模型训练
EasyNLP带你玩转CLIP图文检索 - 知乎作者:熊兮、章捷、岑鸣、临在导读随着自媒体的不断发展,多种模态数据例如图像、文本、语音、视频等不断增长,创造了互联网上丰富多彩的世界。为了准确建模用户的多模态内容,跨模态检索是跨模态…...
期权如何交易?期权如何做模拟交易?
买卖期权的第一步就是要有期权账户,国内的期权品种有商品期权和ETF期权以及股指期权,每种的开户方式和要求都不同,下文为大家介绍期权如何交易?期权如何做模拟交易? 一、期权交易需要开立一个期权账户,可以…...
【新书推荐】大模型赛道如何实现华丽的弯道超车 —— 《分布式统一大数据虚拟文件系统 Alluxio原理、技术与实践》
文章目录 大模型赛道如何实现华丽的弯道超车 —— AI/ML训练赋能解决方案01 具备对海量小文件的频繁数据访问的 I/O 效率02 提高 GPU 利用率,降低成本并提高投资回报率03 支持各种存储系统的原生接口04 支持单云、混合云和多云部署01 通过数据抽象化统一数据孤岛02 …...
Calendar对象获取当前周的bug
项目场景: 双周项目管理,需要获取当前周为一年之中的第几周,原先的代码是用Calendar对象,先用setTime()把当前时间传入,再用get(3)获取一年中的第几周 问题描述 实际发…...
嵌入式环境buildroot的espeak配置与编译
1、在buildroot目录下输入make menuconfig 2、选择Target packages 3、选择Audio and video applications 4、选择espeak、选择alsa via portaudio (新版嵌入式linux一般都是用alsa音频驱动) 5、配置portaudio 选择Library 6、选择Audio/Sound 7、选择…...
物理机环境搭建-linux部署nginx
1、安装nginx部署所需依赖 yum install -y gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel2、安装nginx包 wget http://nginx.org/download/nginx-1.8.0.tar.gz 如果没有wget可以安装一下 yum install -y wget下载完成后可以在/usr/local/下放置tar包…...
删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac)
删除安装Google Chrome浏览器时捆绑安装的Google 文档、表格、幻灯片、Gmail、Google 云端硬盘、YouTube网址链接(Mac) Mac mini操作系统,安装完 Google Chrome 浏览器以后,单击 启动台 桌面左下角的“显示应用程序”,我们发现捆绑安装了 Goo…...
硬件故障诊断:快速定位问题
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
IP代理与加速器:理解它们的区别与共同点
在网络使用过程中,我们经常会遇到需要提高访问速度或保护隐私的需求。IP代理和加速器都是常见的应对方案,但它们在工作原理和应用场景上存在一些区别。本文将为您深入探讨IP代理和加速器的异同,帮助您更好地理解它们的作用和适用情况…...
Java中List转字符串的方法
一、使用String.join方法 在Java 8之后,String类增加了一个静态方法join(),可以方便地将列表中的元素连接成字符串。 // 创建List List<String> list Arrays.asList("Google", "Baidu", "Taobao"); // 以逗号分隔…...
PyTorch实战:实现MNIST手写数字识别
前言 PyTorch可以说是三大主流框架中最适合初学者学习的了,相较于其他主流框架,PyTorch的简单易用性使其成为初学者们的首选。这样我想要强调的一点是,框架可以类比为编程语言,仅为我们实现项目效果的工具,也就是我们…...
【计算机网络】深入理解TCP协议二(连接管理机制、WAIT_TIME、滑动窗口、流量控制、拥塞控制)
TCP协议 1.连接管理机制2.再谈WAIT_TIME状态2.1理解WAIT_TIME状态2.2解决TIME_WAIT状态引起的bind失败的方法2.3监听套接字listen第二个参数介绍 3.滑动窗口3.1介绍3.2丢包情况分析 4.流量控制5.拥塞控制5.1介绍5.2慢启动 6.捎带应答、延时应答 1.连接管理机制 正常情况下&…...
springboot整合sentinel完成限流
1、直入正题,下载sentinel的jar包 1.1 直接到Sentinel官网里的releases下即可下载最新版本,Sentinel官方下载地址,直接下载jar包即可。不过慢,可能下载不下来 1.2 可以去gitee去下载jar包 1.3 下载完成后,进行打包…...
signal(SIGPIPE, SIG_IGN)
linux查看signal常见信号。 [rootplatform:]# kill -l1) HUP2) INT3) QUIT4) ILL5) TRAP6) ABRT7) BUS8) FPE9) KILL 10) USR1 11) SEGV 12) USR2 13) PIPE 14) ALRM 15) TERM 16) STKFLT 17) CHLD 18) CONT 19) STOP 20) TSTP 21) TTIN 22) TTOU 23) URG 24) XCPU 25) XFSZ 2…...
网站流量少/太原做网站的工作室
function onDrawDate(e) {var date e.date;var now new Date(); if (date.getMonth() ! now.getMonth()) {e.allowSelect false;} }...
上海 网站建设业务营销方法/百度导航如何设置公司地址
springboot bootstrap.yml和application.yml bootstrap.yml在application.yml之前加载,一般在spring cloud使用配置中心时使用; bootstrap.yml同名属性会被application.yml覆盖; application.yml在application.properties之前加载ÿ…...
做网站客户怎么找/百度推广账户优化方案
两个抽象方法 Iterator主要有两个抽象方法,让子类实现。 hasNext()用来判断还有没有数据可供访问。next()方法用于访问集合的下一个数据。 这两个方法不像List的get()那样依赖索引获取数据,也不像Queue的poll方法那样依赖特定规则获取数据。 迭代器的…...
网站开发推广渠道/提高工作效率的软件
原文地址:http://blog.csdn.net/honglei915/article/details/37564521 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能。但具有自己独特的设计。这个独特的设计是什么样的呢?首先让我们看几个主要的消息系统术语&am…...
广州市花都区网站建设公司/快点tv下载安装
Angular与Django前后端不分离时,需要将angular的代码集成待Django中,搜了搜,网上居然没有一篇相关的教程,全是简单讲了讲AngularJS和Django的,也不全面,这就很离谱!!! A…...
网站如何更换域名/seo站内优化公司
惊喜和惊吓总是相伴 下一阶段百个cnvd...