当前位置: 首页 > news >正文

【Linux编译器】

前言

打怪升级第: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版本进行调试
热键:回车,回车键会记录上一个执行的指令。
在这里插入图片描述


相关文章:

  • 网站制作内容文案/怎么制作自己的网站
  • 网站上传大文件/百度推广登录账号首页
  • 有没有做问卷还能赚钱的网站/广州网站排名优化公司
  • 牡丹江市广告公司/沈阳seo收费
  • 网站做图片/国内网络推广渠道
  • wordpress 心情评论插件/网上推广方式
  • 转换函数和运算符类
  • 【8】SCI易中期刊推荐——图像处理领域(中科院4区)
  • 聊聊模板方法模式?
  • 【学习】计算机系统硬件和数据结构
  • Vue3+Element-Plus 实现点击左侧菜单时显示不同内容组件展示在Main区域功能
  • Vuejs设计与实现11-编译优化与同构渲染
  • SAP 服务器参数文件详细解析
  • 【C语言】自定义类型
  • 【手写 Vue2.x 源码】第二十六篇 - 数组依赖收集的实现
  • 无服务器架构Serverless
  • 我的2022
  • java springboot 项目构建报错解决办法