c++编译连接库
学习from gcc/g++ 链接库的编译与链接
c++编译分为四个阶段
- 预编译
- 编译
- 汇编
- 链接
预编译
预编译是c++编译的最初部分,它的工作是在编译之前对程序内容进行最有的取舍处理,使得一些语句参加编译,而另一些语句不参加编译。
常用的预编译指令是:
1、包含指令:#include
2、条件指令:#if、#elif、#else、#endif、#ifdef、#ifndef
3、定义指令:#define、#undef
-
include 将包含的头文件展开到程序文件中
- 条件编译指令的作用是直接取舍程序语句和协调多个头文件
比如在升级gcc版本时,同时需要满足旧版本编译,就可以使用条件编译
#if defined(__GNUC__) && (__GNUC__ >= 3 )
//balabala
#else
//balabala other
- 定义指令可以用来防止同一个文件被include多次
这个阶段对于C预处理后的文件后缀是.i, c++处理后文件后缀是.ii
from c++ 预编译
编译
编译阶段的主要工作通过词法分析和语法分析将c++代码翻译成汇编代码
这个阶段会将.i文件转化为.s文件
汇编
顾名思义汇编是将汇编语言翻译成机器指令
将.s文件转化为.o文件
链接
链接库有两种,分别是静态链接库和动态链接库,各有优缺点。
静态链接库
静态链接库可以看做一组.o的集合
在链接阶段会将汇编生成的.o文件和引用到的库链接打包到可执行文件中
静态库对函数库的链接是放在编译阶段完成的
优点:
生成后的可执行文件不依赖静态链接库.a,移植方便
缺点:
浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
动态链接库
编译阶段不会被链接到代码中,在可执行文件运行时才会被载入。
优点:
1.多个应用程序需要调用相同的库,内存中只需要有一份该库实例
2.可以实现进程中的资源共享(我理解是同一个.so在不同的进程中使用的是不同的内存空间,但是可以在.so里使用共享内存来实现资源共享,但是这也算不上动态链接库的优点)
3.将一些程序升级变得简单(比如升级动态链接库代码只需要重新编译.so)
4.设置可以真正做到链接载入完全由程序员在程序代码中控制(显式调用)
缺点:
生成后的可执行文件依赖动态链接库.so
https://github.com/humeay/Learning/tree/master/development/compile
浙公网安备 33010602011771号