Linux编译过程与动静态库制作

一、Linux编译过程

  1. 预处理->编译->汇编->链接

二、预处理

  1. 作用:
    • 宏展开
    • 头文件包含
    • 条件编译
    • 布局控制,如#pragma;添加行号,方便后期问题查错。
  2. 编译命令
    • gcc -E  *.c  -o  *.i

三、编译

  1. 作用:
    • 将预处理生成的代码进行词法、语法与语义进行解析,生成汇编代码。
  2. 命令:
    • gcc -S *.i -o *.s

四、汇编

  1. 作用:
    • 将汇编代码进行处理,转换成计算机能识别指令集,生成目标文件(.o/.obj)。
  2. 命令:
    • gcc -c *.s -o *o

五、链接

  1. 作用
    • 将目标文件与依赖库进行链接,生成可执行文件。
    • 链接器:包括符号解析(代码引用与定义占位符结合,即根据引用符号,找到定义占位符)与重定向(定义占位符与地址集合,即根据定义占位符,从依赖文件中找到代实现代码)。
  2. 命令
    • gcc  *.o -o 可执行文件名称 [-L/库路径 -l库名]
  3. 说明
    • 若链接库路径下,同时存在同名的静态库与动态库,则默认链接动态库,若要链接静态库,需要添加“-static”;

六、动静态库的作用与区别

  1. 作用:
    • 库文件,用于打包代码块,实现代码复用,方便后期开发。
  2. 区别:
    • 动静态库制作命令。
    • 静态库,在链接时,将代码拷贝到引用处,生成目标文件。动态库,在链接时,在引用处添加占位符,在运行时,在动态库中找到代码块运行。
  3. 制作命令:
    • 动静态库制作,都基于目标文件,链接生成库文件。
    • 静态库制作命令:ar -rcs libxxx.a *.o
    • 动态库制作命令:gcc -fPIC -c *.s -o *.o + gcc -shared *.o -o libxxx.so 或 gcc -fPIC -shared *.c -o libxxx.so
  4. 静态库的优缺点:
    • 优点:静态库,在链接时,将代码拷贝到引用处,生成目标文件。在运行时,不需携带静态库,运行可执行文件。运行速度较动态库快。
    • 缺点:链接时,因进行代码拷贝,生成目标文件较大。运行时,因不再依赖库文件,若有功能变更,则涉及功能变动的模块都需要重新编译,不便于后期功能升级。
  5. 动态库的优缺点:
    • 优点:链接时,只添加引用占位符;运行时,以代码复用形式运行,不需要代码块拷贝,生成可执行文件较小;方便升级更新(更换对应库即可)。
    • 缺点:运行可执行文件时,需要携带动态库。在运行时,进行函数调用(入栈出栈),运行速度较静态库慢。
posted @ 2020-03-29 11:28  ~Newbie  阅读(328)  评论(0编辑  收藏  举报