前言
在之前的Linux学习中谈到过Linux中分区分文件后缀,所以文件可以设置后缀来提醒操作者文件类型,也可以什么也不设置。但是Linux系统不区分文件后缀不代表Linux下的程序不区分文件后缀,本篇博文介绍的gcc/c++是区分文件后缀类型的。
1.gcc/g++ 的使用介绍
gcc:C语言编译器,只能编译C语言
g++:C++编译器,C/C++都能编译
2.gcc/g++ 使用方法
1.编译后生成的可执行程序名字默认为a.out
gcc code.c :编译程序
2.自定义可执行程序的名字
gcc code.c -o 自定义名字
3.使用C99标准编译
gcc code.c -std=99
./a.out 执行可执行程序
3.程序到可执行程序的四个阶段
- 预处理阶段
- 编译阶段
- 汇编阶段
- 链接阶段
3.1预处理阶段
预处理阶段要做的工作有:
- 头文件展开
- 去掉注释
- 条件编译
- 宏替换
gcc -E test.c -o test.i :将程序停留在预处理过程后,生成.i文件
3.2编译阶段
编译阶段的主要工作是将代码翻译为汇编代码
gcc -S test.i -o test.s :将程序停留在编译过程后,生成.s文件
3.3汇编阶段
汇编阶段的主要工作是:将汇编代码变成可重定位二进制文件
gcc -c test.s -o test.o :将程序停留在汇编过程后,形成.o文件
3.4链接阶段
链接阶段的主要工作是将.o文件与系统库链接起来生成可执行程序
.o文件 + 系统库 =可执行程序
4.库函数的分类(动静态库)
ldd 可执行程序名 :查看可执行程序依赖的第三方库
可以发现,在路径lib64里有一个文件叫libc.so.6,这个就是a.out程序所要依赖的库
拓展:Linux和Windows下动静态库命名区别:
Linux下:
.so
是动态库.a
是静态库
Windows下:
.ddl
是动态库.lib
是静态库
4.1动静态库的区别与优缺点
4.1.1动静态库的区别:
- 动态库是共享库,通过函数地址来关联程序
- 静态库是私有库,可以独立运行
动态库:
是C/C++或其他第三方提供的所有方法的集合,被所有程序以动态链接的方式关联起来
静态库:
是C/C++或其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码拷贝至自己的可执行程序当中!
通俗的说,静态库是将所有代码拷贝过来,而动态库是去找函数的地址调用此函数。
4.1.2动静态库的优缺点:
-
动态库
优点:形成的可执行程序体积较小,节省资源
缺点:要找函数地址,会稍慢一点,并且有强依赖性
-
静态库:
优点:无视库,可以独立运行
缺点: 体积太大,浪费资源
注:我们在编译代码时,默认使用的是动态库,并且Linux下绝大多数库都是动态库!
如果想链接静态库使用指令:
gcc test.c -static