前言
本文介绍了c/c++的编译过程以及gcc/g++的时使用
一.c/c++翻译的本质:将高级语言翻译成二进制
1)程序翻译过程:
(1)预处理(头文件展开、宏替换、去注释、条件编译)还是C语言代码
头文件展开:将头文件内容拷贝到源文件代码里面
条件编译:根据不同的宏定义进行编译、在预处理阶段会根据条件对代码进行裁剪
在gcc进行编译的时候,可使用-D选项传递不同的宏值
观察到main函数里面代码只剩下一行,剩下的被裁剪掉了
(2)编译(转为汇编语言)汇编文件
(3)汇编(汇编转为二进制)可重定位二进制文件
(4)连接()
二.gcc/g++的使用
1.默认编译
gcc/g++ 文件名
将源文件生成默认命名为a.out的可执行程序
2.指定名称
gcc/g++ 源文件名 -o 可执行程序名 或者 gcc/g++ -o 可执行程序名 源文件名
3.从现在开始翻译,到预处理截至
gcc -E 源文件 -o 预处理后文件.i
4.从现在开始翻译,到编译后截至
gcc -S 文件 -0 编译后文件.s
5.从现在开始翻译,到汇编后截至
gcc -c 文件名 -o 汇编后文件.o
6.从现在开始翻译,到连接后截至
gcc 文件名 -o 可执行文件名
生成可执行程序
7.查看可执行程序依赖的库
ldd 可执行程序名
三、动静态库的理解——链接
Linux下面动态库后缀为.so,静态库后缀为.a
windows下面动态库后缀为.dll,静态库后缀为.lib
动静态库本质都是文件,头文件也是文件
1)动态库
被所有使用者共享,一旦确实,所有使用者都无法运行
优点:可以较大的节约资源,包括磁盘、内存、网络等,在更新时不需要重新编译整个程序,只需要把对应的动态库更换即可。
缺点:一旦缺失一个动态库,所有的程序都无法运行。
2)静态库
将运行所需要的代码拷贝一份到所执行程序中。
优点:独立性高,丢失一份不会影响其他程序的正常运行
缺点:会造成较大的资源浪费,且如果函数库更新,需要重新编译整个程序
通过比较可以看到,静态链接得到的可执行程序比动态链接得到的可执行程序大得多