静态库和动态库
静态库
最早编写的代码,是全部写在一个文件里的,所以编译很简单,直接将该文件编译成为可以执行的应用程序。
随着代码越来越复杂,把大量的代码放进一个文件里,非常不易于管理和多人协作,后来就设计出来可以把代码分开写在不同文件里的方法。这时,编译就复杂了很多,需要先把每个文件编译为.o
文件,然后再把这些.o
文件链接到一起,再生成应用程序。
.o
文件还可以提高编译速度。每次编译时,如果一个文件没有改动,那么这个文件就可以沿用上次编译的.o
文件,不需要重新编译,从而加快了编译速度。
后来,人们为了方便,就把一些通用的代码的.o
文件打包在一起使用,人们把这些打包起来的.o
文件叫做库(library)。
主要使用
ar
这个程序来将.o
文件打包,生成一个.a
文件,这个.a
文件就是一个库。
一个库可能包含大量的函数,我们的程序引用这个库时,往往只调用了其中少数的函数,但我们不必担心会引入多余的函数,因为现在的编译器很聪明,他只会将我们程序中引用的函数从库里面导入来,而不是导入整个库。
后来,又有了动态库的概念,为了和动态库区分开来,我们上面所说的库,现在又称为静态库。
动态库
之所以发明动态库,是因为静态库使用出现性能瓶颈:因为程序规模越来越大,使用的静态库越来越多,最终导致编译时间过长,打包的应用程序过大等问题。
动态库一般是使用
ld
程序来生成。ld
程序将.o
文件打包,生成一个.dylib
文件,这个.dylib
文件就是一个动态库。
在编译时,链接器并没有把动态库的代码打包的应用程序里,链接器只记录了一种承诺, 记录动态库中使用的符号名称,和动态库在运行时的路径。
使用动态库的应用程序,需要依赖动态链接器(dyld
)才能运行。dyld
的作用,就是实现上述链接期间许下的承诺。这里不仔细展开细节。
动态库的使用,减少了编译时间,减少了应用程序的体积,但是同时增加了应用的启动时间。所以在实际开发中,选用更多的静态库,还是更多的动态库,没有统一标准,需要具体分析,找到一个合理的使用方式。
网友评论