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

1.编译过程

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

1.1直接编译

在这里插入图片描述

1.2预处理

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

1.3编译

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

1.4链接

将汇编之后生成的.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都是一样的;
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ych9527/article/details/113356981