当您使用gcc编译代码时,它可以直接生成目标文件,并且可以将多个目标文件链接在一起以生成可执行文件。
静态库只是一个目标文件(通常带有索引)的集合,它可以在创建可执行文件时由链接器使用。
将目标文件链接在一起并链接到一个静态库的区别在于,对于该库,链接器只会从其中选择绝对需要的目标文件,而链接目标文件时链接器将被强制拿走所有的文件。
动态库又不同 - 非常不同。它是一个目标文件的集合,但是这次它的所有内部链接的链接过程的输出已经解决了。
链接动态库意味着链接程序只解析最终可执行文件中的符号,但链接时不添加库中的目标代码。
运行与动态库链接的可执行意味着在运行时一些特殊的软件,有权要求操作系统到指定的动态库加载到内存中(这就是为什么一个动态库必须通过接头创建)通常在节目到达main()
之前。
这个可执行文件可以是磁盘上的一个非常小的文件,但是当加载到内存中,并加载动态库的总内存图像库的整体将在已加载可能相当大了。
我相信它的情况下,如果几个不同的程序需要相同的动态库,操作系统可以为每个程序使用虚拟内存来加载库,但这只使用一个物理内存副本 - 这在某些情况下可以节省很多。
如果您发布需要动态库的可执行文件,那么您可能很幸运,该文件可能已经在用户的机器上。如果没有,你也必须安装它。但是,如果您在库中发现错误,那么只需发送新版本的动态库即可修复这些错误。
用静态库构建的可执行文件已准备就绪,但修复错误将涉及重新传输整个可执行文件。
总结:
object files static library dynamic library
produced by compiler librarian linker
exe large smaller smallest
ram x 1 copy large smaller largest
ram x n copies large smaller smallest
dep on files independent independent dependant
upgrade lib no no yes
动态库作为独立的文件必须存在沿着可执行系统上,而只有在编译时需要静态库存在。使用静态库的主要原因之一是避免在系统中存在多个版本的库时发生冲突,并且可能与链接到可执行文件的版本冲突。 – SirDarius
(从标签和标题中删除“makefile”,因为这与makefile无关。) – Beta
共享库始终具有与位置无关的代码。静态库可以有独立的或独立的。 – 2011-06-24 21:53:22