【Linux编译器】

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

前言

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


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux