问题
静态库和动态库有什么区别?
回答
后缀名不同
动态库的后缀,在 Windows 上是
.dll
,linux 上是
.so
,在 OSX 上是
.dylib
。
静态库,在 WIndows 上是
.lib
,linux 上是
.a
。
可执行文件大小不一样
静态链接的可执行文件要比动态链接的可执行文件要大得多,因为它将需要用到的代码从二进制文件中“拷贝”了一份,而动态库仅仅是复制了一些重定位和符号表信息。
扩展性与兼容性不一样
如果静态库中某个函数的实现变了,那么可执行文件必须重新编译,而对于动态链接生成的可执行文件,只需要更新动态库本身即可,不需要重新编译可执行文件。正因如此,使用动态库的程序方便升级和部署。
依赖不一样
静态链接的可执行文件不需要依赖其他的内容即可运行,而动态链接的可执行文件必须依赖动态库的存在。所以如果你在安装一些软件的时候,提示某个动态库不存在的时候也就不奇怪了。
即便如此,系统中存在一些大量公用的库,所以使用动态库并不会有什么问题。
加载速度不一样
由于静态库在链接时就和可执行文件在一块了,而动态库在加载或者运行时才链接,因此,对于同样的程序,静态链接的要比动态链接加载更快。所以选择静态库还是动态库是空间和时间的考量。但是通常来说,牺牲这点性能来换取程序在空间上的节省和部署的灵活性时值得的,再加上局部性原理,牺牲的性能并不多。
参考:
https://zhuanlan.zhihu.com/p/71372182