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;在计算机中发挥着重要的作用。文章以…

箭头函数与普通函数的差异

一、箭头函数中的this指向 箭头函数的this指向通常有两种情况 如果箭头函数处在一个普通函数之中&#xff0c;那么他的this指向与包裹他的外层函数的this指向一致。其他情况下箭头函数中的this都指向window let obj {fn:function(){console.log(我是普通函数,this obj) …

[渗透测试学习] Surveillance -HackTheBox

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

vue3中的hook公共函数封装及运用

vue3 中的 hooks 就是函数的一种写法&#xff0c;就是将文件的一些单独功能的js代码进行抽离出来&#xff0c;放到单独的js文件中&#xff0c;或者说是一些可以复用的公共方法/功能 使用Vue3的组合API封装的可复用的功能函数自定义hook的作用类似于vue2中的mixin技术自定义Hook…

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 在他的详情中有详细的使用…

半监督学习 - 自训练(Self-training)

什么是机器学习 半监督学习中的自训练&#xff08;Self-training&#xff09;是一种利用已标记数据和未标记数据进行模型训练的方法。以下是自训练的详细教程&#xff1a; 步骤一&#xff1a;准备数据集 标记数据集&#xff1a; 收集和标记一小部分数据&#xff0c;用于有监…

Pandas实战100例 | 案例 21: 条件运算

案例 21: 条件运算 知识点讲解 在 Pandas 中进行条件运算可以用于创建新的列或修改现有的列,基于一定的条件逻辑。这些运算通常结合布尔索引或 apply 方法进行。 布尔条件运算: 可以根据列之间的比较生成布尔值列。apply 方法进行条件运算: 使用 apply 方法可以在 DataFrame…

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查看是否安装并启动成功登录前端查 安…

电动车充气泵方案芯片应用设计

技术工程师在做产品方案开发之前&#xff0c;首先也是最重要的就是芯片选型。为什么这样说呢&#xff1f;那是因为芯片是整个方案设计中&#xff0c;最至关重要的一环&#xff0c;没有它&#xff0c;后面的工作将无法进行&#xff0c;只有将芯片核心基础定下来&#xff0c;后面…

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…

Python 开源 Web 应用框架 Django 简介 应用场景 优势 不足

简介 Django 是一个开放源代码的 Web 应用框架&#xff0c;使用 Python 编程语言编写。它遵循了 “MTV”&#xff08;模型-模板-视图&#xff09;的设计模式&#xff0c;旨在帮助开发者快速构建高质量、易维护的 Web 应用程序。 应用场景 Web 应用开发&#xff1a;Django 适…

【一、测试基础】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;内容很…