【Linux编译器】

news2024/11/28 17:39:41

前言

打怪升级第:22天
在这里插入图片描述

一、gcc、g++

在这里插入图片描述
背景知识:
gcc和g++都是Linux中的编译器,其中gcc只可以编译C语言文件,g++可以编译c++文件,当然也可以编译C语言文件(c++兼容C语言嘛)。
由于两者的操作选项基本一样,这里我们就以gcc为例来深入了解它们。
编译的过程:

  1. 预处理(进行宏替换,头文件包含等操作)
  2. 编译(生成汇编等)
  3. 汇编(生成机器可以识别的代码等)
  4. 链接(生成可执行文件、库文件等)

语法:gcc 选项 .c文件 选项 目标文件
注意:下方是对gcc编译器的各个步骤的拆分介绍,如果只需要知道gcc的使用方法,下方两句指令就足够了:

  1. gcc test.c
  2. ./a.out

(一)预处理

预处理时的操作:

  1. 宏替换,将宏定义的内容替换到对应位置;
  2. 头文件展开,将包含的头文件中的内容拷贝到文件中;
  3. 条件编译,#if #elif #endif;
  4. 去注释,有注释的位置换成空行。

语法:gcc -E test.c -o test.i
功能:从现在开始对文件进行翻译,预处理结束后停止;
-o test.i 是将预处理后的文件信息存储到test.i文件中,(文件名可以随便起,但是很多程序员都会使用 .i 后缀),否则会默认输出到控制台。
在这里插入图片描述


(二)编译

编译时的操作:

  1. 检查文件代码的规范性,语法的正确性;
  2. 将文件编译成汇编代码(默认保存在文件:test.s)。

语法:gcc -S test.c / gcc -S test.i
功能:从现在开始对文件进行翻译,编译结束后停止;
在这里插入图片描述


(三)汇编

汇编时的操作:

  1. 将汇编代码转换为机器可以识别的二进制代码(默认保存在文件:test.o)。

语法:gcc -c test.c / gcc -c test.s / gcc -c test.i (从 test.XXX开始)
功能:从现在开始对文件进行翻译,汇编结束后停止;
在这里插入图片描述
补充:

  1. 由于汇编结束后生成的是二进制代码,我们使用文本模式查看到的会是乱码。
  2. 前三步都是对我们自己写的文件进行翻译,将它翻译为二进制文件。
  3. 头文件不需要进行翻译,因为在预处理阶段已经将需要的头文件拷贝过来了。
  4. 汇编生成的obj文件不可执行,有几个.c文件就会生成几个obj文件。

(四)链接

链接时的操作:

  1. 将我们生成的obj文件与库文件进行链接,生成可执行文件(默认文件名为:a.out)。

语法:gcc test.c / … …
功能:从现在开始对文件进行翻译,生成可执行文件。
在这里插入图片描述


(五)补充:

1.动态库、静态库

在这里插入图片描述

动态库和静态库:我们在进行预处理、编译以及汇编时都是对我们自己写的文件进行翻译,在汇编结束后生成的obj目标文件是不可执行的,
直到链接阶段与库文件链接到一起之后才能生成exe可执行文件。 而链接阶段所链接的库分为两种:静态库和动态库(重要)。
静态库:在编译链接阶段,将库文件中的代码全部拷贝到目标文件中,因此文件会比较大,但是之后就不再需要库文件了;
静态库格式一般为:前缀lib + XXX +后缀 .a

动态库:与静态库相反,在编译链接阶段只是将需要用到的库的地址放到目标文件中,在程序执行时由运行时链接加载库,这样可以减小内存的开销;
动态库格式一般为:前缀lib +XXX +后缀 .so
在这里插入图片描述
我们在日常编写程序时基本上都会用到库函数,系统把这些函数实现都放到了libc.so.6的库函数中去了,在没有特别指定时,gcc 会到
系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6
库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。
在gcc编译的时候默认链接的是动态库,如果想要链接静态库,可以使用指令:gcc test.c -static


2.ldd指令

语法:ldd file
功能:列出文件动态库依存关系
参考文章:ldd命令简介
在这里插入图片描述


(六)其他选项

这里是引用


二、gdb

gdb:对debug版本进行调试
热键:回车,回车键会记录上一个执行的指令。
在这里插入图片描述


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

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

相关文章

转换函数和运算符类

我们以下是采用内联函数来进行的#ifndef ___Class_Counter #if 1 #endif ___Class_counter #include <climits> class Counter{unsigned cnt; // unsigned mmm; public:Counter() : cnt(0) {}//构造函数初始化器//Counter(double mmm):mmm(2){}/*void increment() {i…

低代码平台助力汽车行业构筑新基建

编者按&#xff1a;本文分析了汽车行业数字化转型的需求&#xff0c;并列举了汽车行业利用低代码平台数字化转型的场景&#xff0c;最后通过华晨汽车案例展示了低代码在实现业务模板集成方面的表现。关键词&#xff1a;数据集成&#xff0c;低代码平台&#xff0c;汽车行业汽车…

后台生成4位图像验证码

主要依赖&#xff1a; <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version> </dependency>spring相关依赖参照用到的另行添加。 package com.math.controller;impor…

质心标准差和分散程度

( A, B )---1*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有1个节点&#xff0c;AB各由9张二值化的图片组成&#xff0c;在前述的实验中得到了A全是0&#xff0c;B中有3个1的迭代次数数据。 0 1 2 3 4 5 6 7 8 迭代次数 A-B 1b 1b 1b 0 0 0 0 0 0 54269.648 …

Java 日志框架 JUL

文章目录日志文件的重要性常见日志框架什么是JULJUL架构介绍入门案例JUL日志级别Logger之间的父子关系日志的配置文件日志原理解析日志文件的重要性 做开发最怕的就是线上系统出问题了&#xff0c;轻则留下产品和系统不安全可靠的不好印象&#xff0c;重则影响到公司的收入和口…

②【Spring】一文精通:IOC - 基于XML方式管理Bean

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ IOC操作&#xff1a;基于XML管理Bean一、&…

智公网:公务员行测基础考点

一、法律常识 1. 行政主体要“三有”&#xff0c;一有“权”&#xff08;行政权力&#xff09;&#xff0c;二有“名”&#xff08;以自己名义从事行政管理&#xff09;&#xff0c;三有“责”&#xff08;独立承担行政责任&#xff09;。 2. 受委托的组织和个人不具备行政主…

【自学Python】Python查找字符串

Python查找字符串 Python查找字符串教程 在开发过程中&#xff0c;很多时候我们有在一个 字符串 中查找另一个字符串的需求&#xff0c;在 Python 中&#xff0c;在一个字符串中查找另一个字符串我们使用 find() 函数。 Python find()函数详解 语法 S.find(sub[, start[, …

基于2D Object Detection的目标几何中心三维位置估计(C++)

文章目录 介绍前置知识三维位置估计订阅内参订阅对齐后的深度图并进行后处理源码介绍 这篇博客将简单讲解下如何利用二维目标检测方法和RGBD数据来获取感兴趣目标的几何中心三位位置结果。 前置知识 为了让博客内容显得简洁些,这里不再介绍前置知识,包括: 2D Object Dete…

selenium通过cookie跳过登录验证码实现登录

一般做ui自动化面对验证码一直是一个问题&#xff0c;在网上页百度了一些关于验证码的问题&#xff0c;有通过把验证码提取下来通过pytesser&#xff0c;tesseract&#xff0c;OCR 等库处理&#xff0c;但是这些比较麻烦。 还是因为本人比较渣看不懂&#xff0c;后来想到了weba…

selenium页面元素定位、操作

1 打开 / 关闭浏览器2 打开URL链接3 定位单个页面元素3.1 通过ID定位3.2 通过name定位3.3 通过classname定位3.4 通过CSS定位3.5 通过链接的文本信息定位3.6 通过XPath定位3.6.1 xpath语法3.6.2 实例4 操作4.1 基本操作4.2 切换窗口、框架5 封装selenium的基本操作6 判断元素是…

Express做后端服务详细步骤,从零到一

文章目录一、全局安装脚手架二、生成项目1.生成项目2.目录结构介绍3.拓展&#xff1a;配置文件热更新&#xff08;避免改一次文件重启一次服务&#xff09;步骤1&#xff1a;安装nodemon步骤2&#xff1a;创建nodemon.json文件步骤3&#xff1a;更改启动命令步骤4&#xff1a;上…

如何准确测试相位噪声

相位噪声是表征CW信号频谱纯度的非常重要的参数&#xff0c;衡量了信号频率的短期稳定度。通常所说的相噪为单边带(SSB) 相位噪声&#xff0c;相噪的好坏对于系统的性能至关重要&#xff01; 对于终端通信而言&#xff0c;如果接收机LO的相噪较差&#xff0c;且在信道附近存在…

GO语言开篇-Go语言急速入门(基础知识点)| 青训营笔记

文章目录一.GO语言应用场景1.1 前言1.2 什么是GO语言1.3 仅仅10行完成高并发的服务器二.入门2.1 基础语法-HelloWorld2.2 基础语法-变量类型2.2.1 变量2.2.2 if else2.2.3 循环2.2.4 switch2.2.5 数组2.2.6 切片2.2.7 map2.2.8 range2.2.9 函数2.2.10 指针2.2.11 结构体2.2.12 …

Java基础之《netty(24)—netty入站与出站机制》

一、基本说明 1、netty的组件设计&#xff1a;netty的主要组件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe等。 2、ChannelHandler充当了处理入站和出站数据的应用程序逻辑的容器。 例如&#xff0c;实现ChannelInboundHandler接口&#xff08;或Chan…

开关电源详解

目录 电源分类 线性稳压电源&#xff08;LDO&#xff09; 适用场景 特点 基本组成 开关电源 适用场景 发展方向 特点 分类 基本组成&#xff1a; 开关电源和线性电源对比&#xff1a; 两款开关电源的性能参数对比&#xff1a; 某款电源适配器&#xff1a; 电源分类…

Python NumPy 拆分数组

前言NumPy&#xff08;Numerical Python的缩写&#xff09;是一个开源的Python科学计算库。使用NumPy&#xff0c;就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数&#xff0c;涵盖线性代数运算、傅里叶变换和随机数生成等功能。本文主要介绍Python NumPy 拆分数组…

2-求和(蓝桥杯)

问题描述给定 nn 个整数 a_1, a_2, , a_na1,a2,⋅⋅⋅,an &#xff0c;求它们两两相乘再相加的和&#xff0c;即&#xff1a;Sa_{1} \cdot a_{2}a_{1} \cdot a_{3}\cdotsa_{1} \cdot a_{n}a_{2} \cdot a_{3}\cdotsa_{n-2} \cdot a_{n-1}a_{n-2} \cdot a_{n}a_{n-1} \cdot a_…

2022考研人年度总结,描摹23实习备战进行时

今年&#xff0c;是硝烟弥漫的一年在各个科目上努力也常常焦虑不断怀疑是否真的可以在考研的道路上每一件努力的小事看起来无所谓但却十分有必要2022考研热词是“努力” “披星戴月”“痛苦”你的每一个清晨与深夜都刻满了泪水与汗水春天你最爱期待夏天&#xff0c;夏天你说秋天…

JAVA开发运维(CI/CD)

CI :持续性集成CD&#xff1a;持续性部署SIT&#xff1a;系统集成测试UAT&#xff1a;用户验收测试研发流程的变化&#xff0c;因为用户永远一开始不知道自己想要什么样的东西&#xff0c;导致了软件无法从一而终的进行设计&#xff0c;用户需要能立刻运行的软件和功能。&#…