Linux常用工具——gcc/g++

1.编译过程

我们可以直接用gcc对文件完成编译,也可以进行分步编译,分步编译的过程为预处理,编译,汇编,链接;

1.1直接编译

在这里插入图片描述

1.2预处理

预处理的功能:宏定义替换,文件包含,条件编译,去注释等
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
gcc是如何找到对应的库的呢?
在安装gcc编译器的时候,同时会进行一些库的安装,编译器自身有能力去查找所需要的库;

1.3编译

gcc检查代码的规范性,是否有语法错误等,以及确定代码的实际要做的工作,检查无误后,gcc将代码翻译成汇编语言,生成.s文件;
在这里插入图片描述

1.4汇编

汇编阶段是将编译生成的.s文件转换为目标文件(.o文件),相当于windows中的obj文件,生成机器可识别的二进制目标代码;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.5链接

将汇编之后生成的.o文件进行链接,生成可执行程序

为什么需要链接?
因为我们的程序之中调用了函数接口,因此需要链接函数库;
在这里插入图片描述

1.5其它命令

-shared:尽量使用动态库进行编译,生成的文件会比较小但是需要系统具有动态库
-O0
-O1
-O2
-O3 编译器的4个优化选项,-O0没有优化,-O1为系统缺省,-O3优化级别最高,优化类似windows下的Release版本
-w:对语法检测宽松,不生成任何警告信息
-Wall:对语法检测严格,生成所有警告信息

2.函数库

2.1什么是函数库

由上述可知,我们在预处理阶段只是将头文件“stdio.h”进行了包含,并且头文件中只有printf函数的声明,并没有实现,那么是在哪里实现函数的呢?

系统将这些函数的实现都放到了名为libc.so.6的库文件中去了,在没有特别指定的时候,gcc会到系统默认的搜索路径/usr/lib下进行查找,也就是链接到libc.so.6库函数中去,这样就实现了函数,这也是链接的作用;

在这里插入图片描述

2.2动静态库的差别

在这里插入图片描述

3.g++编译器

程序的编译过程并不是由编译器决定的,因此用任何编译器的编译过程都是预处理,编译,汇编,链接,g++编译器的选项和gcc都是一样的;
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值