gcc/g++工具详解

目录

一、安装gcc/g++

二、背景知识

三、相关选项

四、gcc如何工作

1.预处理

2.编译

 3.汇编

4.链接 

5.函数库的概念 

6.动静态库 


一、安装gcc/g++

gcc/g++ -v : 用来查看当前你使用的gcc/g++版本

 因为我的gcc/g++是升级过的所以版本更高,如果你用的是centos7.6的话你的gcc的版本可能是4.8的。

安装gcc/g++sudo yum install -y gcc-c++

这条指令会根据你当前的centos版本为你安装合适的gcc/g++版本。

gcc用来编译C语言代码,g++一般用来编译C++代码当然也可以用来编译C语言代码 

二、背景知识

在生成一个可执行程序文件的时候通常要经过如下几步:

  1. 预处理(a.去注释 b.宏替换 c.头文件展开 d.条件编译……)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别的代码)
  4. 链接(生成可执行文件或库文件)

三、相关选项

-E从现在开始进行程序的翻译,如果预处理完成,就停下来
-S从现在开始进行程序的翻译,如果编译完成,就停下来
-c从现在开始进行程序的翻译,如果汇编完成,就停下来
-o文件输出到文件
-static对生成的文件采用静态链接
-g生成调试信息
-shared对生成的文件采用动态链接
-O0不做任何优化
-O1尝试优化编译时间和可执行程序大小
-O2在O1的基础上进行更大力度的优化
-O3最高级别优化
-w不生成任何警告信息
-Wall生成所有警告信息

四、gcc如何工作

1.预处理

  • 预处理的功能主要包括宏替换,去注释,条件编译,头文件展开等。
  • 预处理的指令是以#号开头的代码行。
  • 指令:gcc -E mytest.c -o mytest.i
  • -E选项是从现在开始进行程序的翻译,如果预处理完成,就停下来。
  • -o选项是指目标文件。
  • ".i"文件是已经预处理过的C语言原始程序

 #include <stdio.h>#define NUM 20int main(){printf("NUM: %d\n", NUM);printf("hello world1\n");// printf("hello world2\n");// printf("hello world3\n");// printf("hello world4\n");// printf("hello world5\n");printf("hello world6\n");//条件编译#ifdef DEBUG                 printf("hello debug!\n");#elseprintf("hello release!\n");#endifreturn 0;                                                                                                                                                                             
}

通过指令:gcc -E mytest.c -o mytest.i

 生成了一个mytest.i的文件,我们查看这个文件的内容如下

 这里我只截取了一部分,前面还有很多是头文件展开的内容。从这一部分我们不难看出预处理所做的工作。

2.编译

  • 在这个阶段中,gcc首先要检查代码的规范性以及是否有语法错误等等,检查无误后,gcc才会把代码翻译成汇编语言。
  • 指令:gcc -S mytest.i -o mytest.s
  • -S选项是从现在开始进行程序的翻译,如果编译完成,就停下来。

执行上面的指令后生成的“.s”文件内容如下

 3.汇编

  • 此阶段是把编译阶段生成的".s"文件转成目标文件
  • 指令:gcc -c mytest.s -o mytest.o
  • -c选项是从现在开始进行程序的翻译,如果汇编完成,就停下来。

 举个栗子:

执行上面的指令生成的mytest.o文件称为可重定向目标文件,可以查看这个文件的内容如下

 这里显示的都是乱码,我们也可以用od mytest.o进行查看,翻译过来都是二进制

4.链接 

  • 在成功编译之后,就进入了链接阶段
  • 指令:gcc mytest.o -o mytest
  • 生成的mytest文件即为可执行程序

5.函数库的概念 

首先看一个例子:

这个代码能编译通过吗?

答案是:可以的 

 因为它自动给你链接上了C语言的库

再看一个例子:

问:在上面的C语言代码中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现“printf”函数的呢?


系统把这些函数实现都被弄到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用

 

上面中的 /lib64/libc-2.17.so 提供C语言的方法实现,/usr/include/stdio.h 提供C语言的方法列表,方法的声明。两者协同生成可执行程序。

6.动静态库 

一般链接的过程是有两种方式的:

a.动态链接 — 需要动态库

b.静态链接 — 需要静态库

在Linux中以.so结尾的称为动态库,.a结尾的为静态库

在Windows中以.dll结尾的为动态库,.lib结尾的为静态库

查看方式有两种:ldd+可执行程序文件名/file+可执行程序文件名

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面图所示的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc test.o –o test
  • gcc/g++默认生成的二进制程序是动态链接的,这点可以通过 file 命令验证

 由图可以看出,静态链接的文件比动态链接的文件大得多了。

安装静态库的命令

C语言静态库安装:sudo yum install -y glibc-static

C++静态库安装:sudo yum install -y libstdc++-static

这次的内容就分享到这了,如有写的不好的地方还请指正,创作不易,如果你觉得写的好的话,就给博主三连吧,你的支持将是我的动力 

 谢谢!!!

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

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

相关文章

干货|Google ads谷歌广告投放详细步骤与技巧

对于跨境电商、独立站运营的卖家来说&#xff0c;谷歌广告投放是必备的流量拓展来源&#xff0c;但是在投入运营之前&#xff0c;你需要完整了解谷歌广告投放详细步骤&#xff0c;以为你丝滑地进行有效投放做好基础&#xff0c;下面为大家整理具体的谷歌投放技巧与步骤&#xf…

BIOS知识枝桠——认识主板

文章目录 前言一、主要构成二、I/O区域1.I/O区域2.CPU区域与内存区域3.拓展区域4.南桥区域与外围接口 其他 前言 主板由电路板铜线芯片针脚数千个精密的元器件组合构成&#xff0c;是把显卡、内存、CPU等核心硬件串在一起的骨架&#xff0c;在计算机中发挥着重要的作用。文章以…

[渗透测试学习] Surveillance -HackTheBox

文章目录 信息搜集getshell提权信息搜集 nmap扫描端口 nmap -sV -sC -v -p- --min-rate 1000 10.10.11.245扫出来两个端口,其中80端口有http服务并且重定向到surveillance.htb 那么我们添加下域名然后访问80端口,发现是企业网站尝试扫描子域名和目录无果后,用Wappalyzer插…

NetCore部署微服务(三)

接上文&#xff0c;服务端部署完成之后&#xff0c;同样我们也需要修改一下客户端代码 Blocking Queries 1.1 服务发现 在客户端代码中使用Nuget安装consul包 修改配置文件&#xff0c;我们首先需要把consul的请求地址配置在配置文件中 修改control方法 using Consul; usin…

复选框QCheckBox和分组框QGroupBox

1. 复选框&#xff1a;QCheckBox 实例化 //实例化 // QCheckBox* checkBox new QCheckBox("是否同意该条款",this);QCheckBox* checkBox new QCheckBox(this);1.1 代码实现 1.1.1 复选框的基本函数 复选框选中状态的参数 Qt::Unchecked //未选中状态 Qt::Part…

学习C指针

指针基本介绍 计算机中的每个内存都有地址 整型分配4字节&#xff0c;字符分配1字节 &#xff0c;浮点数分配4字节 指针是一个变量&#xff0c;它存放着另外一个变量的地址 int a; int *p; p &a;// a 5; printf(p) //get a address print &a //get a address …

chatgpt免费使用的网站

前言 如果您认为本文对你有帮助&#xff0c;希望可以点赞收藏&#xff01;感谢您的支持 下面我为你推荐我自己在用的gpt类工具&#xff0c;帮你在工作学习生活上解决一些大小问题 &#x1f389;智能GPT 地址&#xff1a; https://meet.adminjs.net 在他的详情中有详细的使用…

ubuntu18.04.6 搭建mqtt服务器emqx 之docker方式

ubuntu18.04.6 搭建mqtt服务器emqx 之docker方式 前提docker环境已经安装好 如未安装&#xff0c;请参考博文https://blog.csdn.net/a554521655/article/details/134251763 文章目录 ubuntu18.04.6 搭建mqtt服务器emqx 之docker方式安装emqx查看是否安装并启动成功登录前端查 安…

FastAdmin西陆教育系统(xiluEdu)开源代码

应用介绍 一款基于FastAdminThinkPHPUniapp开发的西陆教育系统&#xff08;微信小程序、移动端H5、安卓APP、IOS-APP&#xff09;&#xff0c;以下是教育系统所包含的一些功能&#xff1a; 视频课程&#xff1a;教育系统提供在线视频课程&#xff0c;学生可以通过网络观看教师…

每日一题——LeetCode1154.一年中的第几天

方法一 列举法&#xff1a; 用一个数组把每个月份的天数都列举出来 判断闰年&#xff0c;是闰年2月份有29天 循环对当前月份之前的月份天数求和 加上当天月份的天数 var dayOfYear function(date) {let year date.slice(0, 4);let month date.slice(5, 7);let day dat…

Android 13 辅助屏导航栏不显示问题

问题 在Android 13 上开启辅助屏幕。但是发现辅助屏systemui 导航按 icon没有显示,但是点击对应的区域有作用 分析 可以用 anroid device monitor 工具分析视图 解决 public NavigationBarView(Context context, AttributeSet attrs) {super(context, attrs);//add star…

【一、测试基础】Java基础语法

Java 的用法及注意事项有很多&#xff0c;今天的目标是了解Java基础语法&#xff0c;且能够输出"hello world" 几个基础的概念 对象&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。一只猫是一个对象&#xff0c;猫的状态有&#xff1a;颜色、名字、品种&…

公众号突破2个限制技巧怎么操作?

一般可以申请多少个公众号&#xff1f;目前企业主体只能申请2个公众号&#xff0c;这也意味着想做矩阵公众号的难度提升了。有些公司靠着诸多不同分工的公众号形成一个个矩阵&#xff0c;获取不同领域的粉丝。比如&#xff0c;目前主体为xx旗下公众号&#xff0c;共有30个&…

《动手学深度学习》学习笔记 第9章 现代循环神经网络

本系列为《动手学深度学习》学习笔记 书籍链接&#xff1a;动手学深度学习 笔记是从第四章开始&#xff0c;前面三章为基础知识&#xff0c;有需要的可以自己去看看 关于本系列笔记&#xff1a; 书里为了让读者更好的理解&#xff0c;有大篇幅的描述性的文字&#xff0c;内容很…

【自控实验】1. 线性系统串联超前校正实验

本科课程实验报告&#xff0c;有太多公式和图片了&#xff0c;干脆直接转成图片了 仅分享和记录&#xff0c;不保证全对 串联超前校正实验&#xff1a;频域设计计算(校正装置)&#xff0c;时域观察验证(校正结果) 使用matlab中的simulink进行仿真

PyCharm中配置安装PyQt5、QtDesigner

PyCharm中配置安装PyQt5 使用 pip install PyQt5 命令安装。 安装pyqt5-tools&#xff1a;pip install pyqt5-tools 安装PyQt5Designer&#xff1a;pip install PyQt5Designer 上述三个都安装好之后&#xff0c;输入 pip list 查看一下 有如下内容就安装成功啦&#xff01;…

【Linux Shell】5. 运算符

文章目录 【 1. 算术运算符 】1.1 expr 命令1.2 [ ] 方括号 【 2. 关系运算符 】【 3. 布尔运算符 】【 4. 逻辑运算符 】【 5. 字符串运算符 】【 6. 文件测试运算符 】 【 1. 算术运算符 】 运算符说明举例赋值a$b 把变量 b 的值赋给 a。 1.1 expr 命令 原生 bash 不支持简…

SpringCloud系列篇:核心组件之熔断器组件

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringCloud的相关操作吧 前言 在微服务架构中&#xff0c;一个应用往往由多个服务组成&#xff0c;这些服务之间相互依赖&#xff0c;依赖关系错综复杂。 例…

C++程序员必备的面试技巧

“程序员必备的面试技巧&#xff0c;就像是编写一段完美的代码一样重要。在面试战场上&#xff0c;我们需要像忍者一样灵活&#xff0c;像侦探一样聪明&#xff0c;还要像无敌铁金刚一样坚定。只有掌握了这些技巧&#xff0c;我们才能在面试的舞台上闪耀光芒&#xff0c;成为那…

经验分享:智能知识库才是数字时代的企业必备选择

随着全球化和竞争的加剧&#xff0c;企业必须通过将知识作为战略资产进行管理&#xff0c;才能保持竞争优势。因此&#xff0c;建设有效的知识库系统&#xff0c;成为了数字时代企业必备的选择。决定企业成功或失败的不再仅仅是产品或服务的质量&#xff0c;而是如何有效利用知…