【Linux】Linux编译器-gcc/g++使用

1. 背景知识

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库文件)

2. gcc如何完成

格式 

gcc [选项] 要编译的文件 [选项] [目标文件]

预处理(进行宏替换)

预处理功能主要包括宏定义,文件包含,条件编译,去注释等

  • 预处理指令是以#号开头的代码行

实例: 

gcc –E hello.c –o hello.i
  • 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程
  • 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序

编译(生成汇编)

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言

  • 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码

实例:

gcc –S hello.i –o hello.s

汇编(生成机器可识别代码)

汇编阶段是把编译阶段生成的“.s”文件转成目标文件

  • 在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了

实例:

gcc –c hello.s –o hello.o

链接(生成可执行文件或库文件)

在成功编译之后,就进入了链接阶段。

实例: 

gcc hello.o –o hello

函数库

在这里涉及到一个重要的概念:函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

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

函数库一般分为静态库和动态库两种。

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

gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证

gcc选项

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  • -S  编译到汇编语言不进行汇编和链接
  • -c  编译到目标代码
  • -o  文件输出到文件
  • -static 此选项对生成的文件采用静态链接
  • -g 生成调试信息。GNU 调试器可利用该信息
  • -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
  • -O0
  • -O1
  • -O2
  • -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  • -w  不生成任何警告信息
  • -Wall 生成所有警告信息

gcc-o

这样我们就可以编译成指定的文件名称

gcc选项记忆

  • esc,iso例子

g++

gcc不能用来编译c++代码,我们创建一个test.cc,.cc表示是c++代码,但是用gcc编译会报错

所以我们就可以用g++来编译c++文件

g++的选项和gcc的选项一模一样,所以也可以带上选项

使用c++11标准

gcc不能编译c++代码,但是g++可以编译c语言代码

g++也可以加-o选项,编译成指定的可执行程序

c++的文件后缀

c++的文件后缀有三种:.cc  .cpp  .cxx

(Linux不关心文件后缀不代表编译器不关心文件后缀)

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

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

相关文章

【Linux】-对于信号章节补充的知识点,以及多线程知识的汇总

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

【shell-09】 shell控制台颜色输出

echo -e echo -e 一个重要的小例子和换行符控制字符一样,终端颜色也有自己的十进制控制符颜色的写法颜色参考图表 echo -e 一个重要的小例子 echo -e 的意思:如果字符串中出现某些特定的字符组合(转义字符),echo会将这…

大模型学习与实践笔记(十二)

使用RAG方式,构建opencv专业资料构建专业知识库,并搭建专业问答助手,并将模型部署到openxlab 平台 代码仓库:https://github.com/AllYoung/LLM4opencv 1:创建代码仓库 在 GitHub 中创建存放应用代码的仓库&#xff…

DAY08_SpringBoot—整合Mybatis-Plus

目录 1 MybatisPlus1.1 MP介绍1.2 MP的特点1.3 MybatisPlus入门案例1.3.1 导入jar包1.3.2 编辑POJO对象1.3.3 编辑Mapper接口1.3.4 编译YML配置文件1.3.5 编辑测试案例 1.4 MP核心原理1.4.1 需求1.4.2 原理说明1.4.3 对象转化Sql原理 1.5 MP常规操作1.5.1 添加日志打印1.5.2 测…

电脑存储位置不够怎么办

电脑内存不够怎么办!!! 我前段时间经常因为电脑D盘内存不够而苦恼(毕竟电脑内存就那么丁点,C盘作为系统盘不能随便下东西的情况下,就只能选择其他盘进 方法一:检查电脑硬盘的分区情况&#xf…

全国大学生智能汽车竞赛—解决Ubuntu 18.04.6 无法连接网络的问题

1.1 用到的命令 lshw (1)功能描述: lshw是一个提取机器硬件配置详细信息的工具,并且能将结果输出成HTML、json、XML等格式。 (2)输出形式: -class 仅显示一类硬件信息,可以使用lshw -short或ls…

网络:PPP协议

1. HDLC协议 高级链路控制协议 2. PPP协议 点对点协议,是point-to-point的简称。和以太网协议一样,PPP是数据链路层协议,定义了帧格式,称为PPP帧。 3. PPP协议与以太网协议的区别 以太网协议工作在以太网接口和以太网链路上。 以…

如何通过系统命令排查账号安全?

如何通过系统命令排查账号安全 query user 查看当前登录账号 logoff id 注销用户id net user 查看用户 net user username 查看用户登录情况 lusrmgr.msc 查看隐藏账号 winR打开regedit注册表 找到计算机\HEKY_LOCAL_MACHINE\SAM\SAM\右键给与用户读写权限 刷新打开 HKEY…

ps去除图片上的文字

1. 打开ps, 打开文件 2. 选择套索工具 3. 使用套索工具将需要去除的文字框选 4. 然后鼠标右击,选择内容识别填充 5. 应用确定后, 此时文字就去掉了

【Java】一文读懂逃逸分析

逃逸分析 逃逸分析(Escape Analysis)是一种编译器优化技术,它分析程序中的对象分配,以确定对象的作用域和生命周期。具体来说,逃逸分析要确定一个对象是否会逃逸出它被创建的方法或者作用域,换句话说&…

保姆级CISP报考攻略,让你不再迷茫

信息安全领域越来越火,想要在这个行业闯出一片天?CISP认证就是你的“敲门砖”!想知道如何顺利考取这个超牛的证书吗?下面就带你一起探索保姆级CISP报考流程!🎉 🎓报考条件🎓 学历专业…

vue2中的事件修饰符

在Vue2中,事件修饰符是一种用于在DOM事件处理中进行特定操作的特殊标记。Vue2提供了一些内置的事件修饰符来简化事件处理逻辑。以下是Vue2中常用的事件修饰符: .prevent:阻止默认事件(常用);.stop&#xff…

推荐在线PS修图网页版工具PHP网站源码

在线PS修图网页版工具PHP网站源码,PHP在线照片图片处理PS网站程序源码photoshop网页版。 有很多朋友们都是在用PS作图的,众所周知在使用和学习PS时是需要下载软件的,Photoshop软件对电脑配置也是有一定要求的,今天就为大家带来一…

关于C#中的Select与SelectMany方法

Select 将序列中的每个元素投影到新表单。 实例1 IEnumerable<int> squares Enumerable.Range(1, 10).Select(x > x * x);foreach (int num in squares) {Console.WriteLine(num); } /*This code produces the following output:149162536496481100 */ 实例2 str…

牛客网-----跳石头

题目描述&#xff1a; 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行&#xff0c;河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间&#xff0c;有N块岩石(不含起点和终点的岩石)。在比赛过程中&#xff0…

第十一章:大模型之Adaptation

参考链接&#xff1a;https://github.com/datawhalechina/so-large-lm/tree/main 1 引言 为什么需要Adaptation? 在⾃动化和⼈⼯智能的时代&#xff0c;语⾔模型已成为⼀个迅速发展的领域。从语⾔模型的训练⽅式来说&#xff0c;语⾔模型&#xff0c;例如GPT-3&#xff0c;…

JAVA算法—排序

目录 *冒泡排序&#xff1a; *选择排序&#xff1a; 插入排序&#xff1a; 快速排序&#xff1a; 总结&#xff1a; 以下全部以升序为例 *冒泡排序&#xff1a; 引用&#xff1a; 在完成升序排序时&#xff0c;最大的元素会经过一轮轮的遍历逐渐被交换到数列的末尾&#…

项目实战——Qt实现FFmpeg音视频转码器

文章目录 前言一、移植 FFmpeg 相关文件二、绘制 ui 界面三、实现简单的转码四、功能优化1、控件布局及美化2、缩放界面3、实现拖拽4、解析文件5、开启独立线程6、开启定时器7、最终运行效果 五、附录六、资源自取 前言 本文记录使用 Qt 实现 FFmepg 音视频转码器项目的开发过…

LeetCode 410. 分割数组的最大值

一、题目 1、题目描述 给定一个非负整数数组 nums 和一个整数 k &#xff0c;你需要将这个数组分成 k 个非空的连续子数组。 设计一个算法使得这 k 个子数组各自和的最大值最小。 2、接口描述 ​ class Solution { public:int splitArray(vector<int>& nums, int …

Kubernetes/k8s之HPA,命名空间资源限制

Horizontal Pod Autoscaling:po的水平自动伸缩 这是k8s自带的模块 pod占用cpu比例达到一定的阀值&#xff0c;会触发伸缩机制。 根据cpu的阀值触发伸缩机制 replication controller 副本控制器 控制pod的副本数 deployment controller 节点控制器 部署pod hpa控制副本的数…