开源软件的编译
版权声明:Yadi
|
CC BY-NC-SA 2.5 CN
1. 开源软件的编译套路
- 先执行configure,configure完成后会生成Makefile,然后执行make编译,编译完成后执行make install安装。
- 有的开源软件源码没有configure,需要先autoconf生成configure,然后再执行第一步。
2. 静态库与动态库
2.1 静态库
- 概念
静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。 - 特点
可执行文件中包含了库代码的一份完整拷贝,静态库的代码是在编译过程中被载入程序中。 - 缺点
就是被多次使用就会有多份冗余拷贝。
2.2 动态库
- 概念
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。 - 特点
函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。
DLL 还有助于共享数据和资源,多个应用程序可同时访问内存中单个DLL 副本的内容。
DLL 是一个包含可由多个程序同时使用的代码和数据的库,Windows下动态库为.dll后缀,在linux下为.so后缀。
2.3 静态库与动态库的区别
- 命名
静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名;动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。所以为“libmytime.so”。 - 链接
静态库的代码是在编译过程中被载入程序中;动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函数。
静态库和程序链接有关和程序运行无关;动态库和程序链接无关和程序运行有关。 - 更新
如果所使用的静态库发生更新改变,你的程序必须重新编译;动态库的改变并不影响你的程序,动态函数库升级比较方便。 - 内存
静态库每一次编译都需要载入静态库代码,内存开销大。
动态库系统只需载入一次,不同的程序可以得到内存中相同的动态库的副本,内存开销小。
当同一个程序分别使用静态库,动态库两种方式生成两个可执行文件时,静态链接所生成的文件所占用的内存要远远大于动态链接所生成的文件。