美文网首页
编译原理与语法(一)——动态库与静态库

编译原理与语法(一)——动态库与静态库

作者: 王志强_9380 | 来源:发表于2019-10-10 17:08 被阅读0次

编译流程

预处理

  • 完成宏替换、文件引入,去除空行、注释等,为下一步编译做准备
  • 对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等
test.c

#include <stdio.h>

int main(){
    printf("hello world!\n");
    return 0;
}

$ gcc -E test.c -o test.i
-E:让gcc在预处理结束后停止编译
-o:指定输出文件
"test.i"文件为预处理后输出的文件

编译

  • 将预处理后的代码编译成汇编代码。在这个阶段中,首先检查代码的规范性、是否有语法错误等,以确定代码实际要做的工作,在检查无误后,再把代码翻译成汇编语言
  • 汇编程序执行时,先分析,后综合。分析,就是指词法分析、语法分析、语义分析和中间代码生成。综合,就是指代码优化和代码生成
  • 大多数的编译程序直接产生机器语言的目标代码,形成可执行的目标文件,也有的是先产生汇编语言一级的符号代码文件,再调用汇编程序进行翻译和加工处理,最后产生可执行的机器语言目标文件。

$ gcc -S test.i -o test.s
-S:让gcc在编译结束后停止编译过程
"test.s"文件为编译后生成的汇编代码

汇编

  • 就是把编译阶段生成的“.s”文件转成二进制目标代码,也就是机器代码(0 1 序列)

$ gcc -c test.s -o test.o
-c:让gcc在汇编结束后停止编译过程
"test.o"文件为汇编后生成的机器码目标文件

链接

  • 就是将多个目标文件以及所需的库文件链接生成可执行目标文件的过程

$ gcc test.o -o test
-o:本质上是一个重命名选项。不使用时,默认生成的是a.out文件。这里生成的是可执行文件test

$ ./test
执行后输出hello world!

静态库和动态库

静态库

  • 静态库实际就是一些目标文件(一般是.o)的集合,静态库一般以.a结尾,只用于生成可执行文件阶段
  • 在连接步骤中,链接器将从库文件取得所需代码,复制到生成的可执行文件中。这种库称为静态库。
  • 特点是,可执行文件中包含了库代码的一份完整拷贝,在编译过程中被载入程序中。
  • 缺点是,多次使用会有多份冗余拷贝,并且对程序的更新、部署和发布会带来麻烦,如果静态库有更新,那么所有使用它的程序都需要重新编译发布。
生成静态库

$ gcc -c test.c -o test.o
$ ar rcs libtest.a test.o
ar:该命令将目标文件打包成静态库。
r:更新或增加新文件到静态库
c:不管库是否存在,都创建一个库
s:创建文档索引,对于文件较大的库,能加快编译时间
这条命令就是把test.o打包成libtest.a静态库
$ ar t libtest.a
使用该命令查看静态库内容

动态库

  • 动态库在链接阶段没有被复制到程序中,而是在程序运行时由系统动态加载到内存中供程序调用
  • 系统只需载入一次动态库,不同的程序可以得到内存中相同动态库的副本,因此节省了很多内存
生成动态库

$ gcc -c test.c -o test.o
$ gcc -shared -fPIC -o libtest.so test.o

相关文章

  • 编译原理与语法(一)——动态库与静态库

    编译流程 预处理 完成宏替换、文件引入,去除空行、注释等,为下一步编译做准备 对各种预处理命令进行处理,包括头文件...

  • iOS静态库及动态库

    2018-06-19 浅析静态库链接原理编译原理以及什么是静态库和动态库 转之: iOS 静态库和动态库(库详解)...

  • 编译原理以及什么是静态库和动态库

    为什么本人将编译原理和静态库,动态库放在一起讲.因为只有理解了编译的原理,才能真正明白什么是静态库和动态库. 1....

  • 静态库与动态库区别

    本文动态库、静态库区别部分转载自C++静态库与动态库 程序的编译过程如上图 静态库: 之所以成为【静态库】,是因为...

  • 静态库与动态库相关知识笔记(转)

    "静态库与动态库"参考静态库与动态库的区别与优缺点

  • iOS静态库与动态库的区别与打包

    iOS静态库与动态库的区别与打包iOS静态库与动态库的区别与打包

  • Embedded Binaries 和 Linked Frame

    1:iOS 动态库与静态库的区别(framework,.a,.dylib) 一点通俗的理解: 1)静态库:编译期间...

  • 创建SDK

    一.IOS库简介 静态库与动态库 静态库:在编译的时候会被直接拷贝一份,复制到目标程序里。牺牲app体积来减少编译...

  • 静态库

    静态库 静态库动态库简介 .a 静态库:被编译好的二进制文件 静态库:.a, .framework 动态库: .d...

  • iOS开发集锦之 2017.04.17

    1. iOS 静态库,动态库与 Framework 浅析 作者:Jenaral描述: 静态库与动态库的区别;iOS...

网友评论

      本文标题:编译原理与语法(一)——动态库与静态库

      本文链接:https://www.haomeiwen.com/subject/doxmpctx.html