编译过程与静态库&动态库

一、编译过程

编译过程.jpg

1、预编译(Preprocessing)

       预编译即预处理,编译器不能直接对预编译命令进行编译,必须在对程序进行编译之前,先对程序中这些特殊的命令进行处理。预编译主要处理以“#”开始的编译命令,如宏定义,条件编译,文件包含,去注释等。

 $ clang -E main.m  

2、编译(Compilation)

       将预编译处理完后的代码编译成汇编代码。此阶段还进行了词法、语法分析、生成LLVM IR中间代码、bitcode优化,最后生成汇编代码

$ clang -S -fobjc-arc main.m -o main.s

3、汇编(Assemble)

       把.s的汇编文件转成可执行的二进制文件。

4、链接(Linking)

       将汇编生成的目标文件与所有的引用的库一起链接打包到可执⾏文件当中。此阶段只链接静态库,如 .a .lib 等

二、静态库

       静态库是经过编译的二进制文件。在链接阶段,引用库一旦链接成功,将汇编生成的目标文件与引用的库一起链接打包到可执⾏文件当中。

优点

1、代码装载速度快,执行速度略比动态链接库快;
2、编译进二进制文件当中,相对安全。

缺点

1、代码冗余度高;
2、APP容量增大。

三、动态库

       程序编译阶段并不会链接到目标二进制文件当中,⽽是在程序运行时才被载⼊。

优点

1、减少打包之后的APP的容量;
2、共享内存,节约资源;
3、通过更新动态库,实现热更新;
4、冗余少,低耦合。

缺点

1、不稳定,不安全

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容