一、Linux编译过程
- 预处理->编译->汇编->链接
二、预处理
- 作用:
- 宏展开
- 头文件包含
- 条件编译
- 布局控制,如#pragma;添加行号,方便后期问题查错。
- 编译命令
三、编译
- 作用:
- 将预处理生成的代码进行词法、语法与语义进行解析,生成汇编代码。
- 命令:
四、汇编
- 作用:
- 将汇编代码进行处理,转换成计算机能识别指令集,生成目标文件(.o/.obj)。
- 命令:
五、链接
- 作用
- 将目标文件与依赖库进行链接,生成可执行文件。
- 链接器:包括符号解析(代码引用与定义占位符结合,即根据引用符号,找到定义占位符)与重定向(定义占位符与地址集合,即根据定义占位符,从依赖文件中找到代实现代码)。
- 命令
- gcc *.o -o 可执行文件名称 [-L/库路径 -l库名]
- 说明
- 若链接库路径下,同时存在同名的静态库与动态库,则默认链接动态库,若要链接静态库,需要添加“-static”;
六、动静态库的作用与区别
- 作用:
- 库文件,用于打包代码块,实现代码复用,方便后期开发。
- 区别:
- 动静态库制作命令。
- 静态库,在链接时,将代码拷贝到引用处,生成目标文件。动态库,在链接时,在引用处添加占位符,在运行时,在动态库中找到代码块运行。
- 制作命令:
- 动静态库制作,都基于目标文件,链接生成库文件。
- 静态库制作命令:ar -rcs libxxx.a *.o
- 动态库制作命令:gcc -fPIC -c *.s -o *.o + gcc -shared *.o -o libxxx.so 或 gcc -fPIC -shared *.c -o libxxx.so
- 静态库的优缺点:
- 优点:静态库,在链接时,将代码拷贝到引用处,生成目标文件。在运行时,不需携带静态库,运行可执行文件。运行速度较动态库快。
- 缺点:链接时,因进行代码拷贝,生成目标文件较大。运行时,因不再依赖库文件,若有功能变更,则涉及功能变动的模块都需要重新编译,不便于后期功能升级。
- 动态库的优缺点:
- 优点:链接时,只添加引用占位符;运行时,以代码复用形式运行,不需要代码块拷贝,生成可执行文件较小;方便升级更新(更换对应库即可)。
- 缺点:运行可执行文件时,需要携带动态库。在运行时,进行函数调用(入栈出栈),运行速度较静态库慢。
Linux编译过程与动静态库制作