文章目录
- gcc/g++的使用
- 使用方法:
- 程序翻译的四个阶段
- 预处理阶段
- 编译阶段
- 汇编阶段
- 链接阶段
- 库函数的命名和分类(动静态库)
- 动静态库的区别与优缺点
gcc/g++的使用
gcc:C语言编译器,只编译C语言文件
g++:C++编译器,C/C++都可以编译
使用方法:
1.生成默认的可执行文件:a.out
gcc test.c
2.自定义可执行程序的名字
gcc test.c -o 自定义名字
3.使用C99标准来编译
gcc test.c -std=c99
那么生成的可执行程序是什么样的呢?
编译后,会在当前目录生成一个
可执行程序,此文件通常是绿色的
如何指向代码呢?
输入./a.out
程序翻译的四个阶段
早在C语言阶段我们就已经了解了程序编译的四个阶段,现在我们再来熟悉一下。
预处理阶段
预处理阶段包括四个方面:
1.头文件展开
2.去掉注释
3.条件编译
4.宏替换
接下来用指令验证一下:
gcc -E test.c -o test.i
vim指令打开test.i文件
,我们写的代码在最下面
然而上面还有几百行其实就是头文件展开
所谓头文件展开就是:
将头文件的内容拷贝到当前文件
在头文件中有许多空行,这是
因为原先的头文件有注释,此时注释已经没了
编译阶段
编译阶段的主要工作是将C语言翻译为汇编代码。
同样的也可以输入指令验证:
gcc -S test.i -o test.s
将程序停留在编译过程后,生成.s文件
这里就靠大家自行验证了。
汇编阶段
汇编阶段的主要工作是:
将汇编代码变成可重定位二进制文件,文件里存放的是二进制信息。
同样的输入指令:
gcc -c test.s -o test.o
将程序停留在汇编过程后,形成.o文件
链接阶段
链接阶段比较复杂,它大致的流程是这样的:
.o文件 + 系统库 = 可执行程序
库函数的命名和分类(动静态库)
我们在写C语言代码时使用的printf函数
并没有自己实现,然而在stdio.h头文件中
也只有printf函数的说明,那么此函数的
实现是在哪里实现的呢?
查看一个可执行程序依赖的第三方库。
使用指令: ldd 可执行程序名
在路径lib64里有一个文件叫libc.so.6,这个就是刚刚的C语言程序所要依赖的库。
如何解释库呢?看到下面这张图片相信会有答案。
libc.so.6实际上就是C的标准库!
Linux和Windows下动静态库命名区别有什么区别呢?
Linux下: .so 是动态库 .a 是静态库
Windows下: .ddl 是动态库 .lib 是静态库
到了这里相信就可以很容易的理解链接的过程了。
链接过程就是将.o文件和动/静态库结合的过程。
动静态库的区别与优缺点
区别:
动态库是共享库,通过函数地址来关联程序
静态库是私有库,可以独立运行
动态库: 是C/C++或其他第三方提供的所有方法的集合,被所有程序以动态链接的方式关联起来。
静态库: 是C/C++或其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码拷贝至自己的可执行程序当中!
说白了,静态库是将所有代码拷贝过来
而动态库是去找函数的地址调用此函数
动静态库的优缺点: 动态库: 优点:形成的可执行程序体积较小,节省资源 缺点:要找函数地址,会稍慢一点,并且有强依赖性
静态库: 优点:无视库,可以独立运行 缺点: 体积太大,浪费资源
如何当你想使用静态库编译代码该怎么做呢?
只需输入指令: gcc code.c -static即可。