函数是可在整个程序中重用的代码块。使用它们可以节省时间,无需多次重写代码。与函数一样,库也可以节省时间,因为它们使函数可以在多个程序中重用。
静态库或静态链接库是一组例程,外部函数和变量,它们在编译时在调用者中解析,并由编译器,链接器或绑定器复制到目标应用程序中,从而生成目标文件和一个独立的可执行文件。动态链接只包括库的地址(而静态链接是浪费空间)动态链接在运行时链接库。
静态库虽然可以在多个程序中重用,但在编译时会被锁定到程序中。另一方面,动态或共享库作为可执行文件之外的单独文件存在。
使用静态库的缺点是它的代码被锁定到最终的可执行文件中,如果没有重新编译就无法修改。相反,可以修改动态库而无需重新编译。
由于动态库位于可执行文件之外,因此程序只需在编译时制作库文件的一个副本。而使用静态库意味着程序中的每个文件都必须在编译时拥有它自己的库文件副本。
使用动态库的缺点是程序更容易破坏。例如,如果动态库损坏,则可执行文件可能不再起作用。但是,静态库是不可触及的,因为它存在于可执行文件中。
使用动态库的好处是,多个正在运行的应用程序可以使用相同的库,而无需每个应用程序拥有自己的副本。
使用静态库的另一个好处是运行时的执行速度。因为它的目标代码(二进制)已经包含在可执行文件中,所以对多个函数的调用可以比动态库的代码更快地处理,而动态库的代码需要从可执行文件之外的文件中调用。
这在实践中意味着什么?好吧,想象一下你是一个向数千名用户发布应用程序的开发人员。如果您想对应用程序进行一些更新,您是否需要重新发布整个程序,还是只想以修改后的库的形式发布更新?答案取决于您的应用程序可以承受的缺点。如果你有很多文件,静态库的多个副本意味着可执行文件的大小增加。但是,如果执行时间的好处超过节省空间的需要,那么静态库就是最佳选择。
性能 | 静态库 | 共享库 |
---|---|---|
连接的时间 | 它发生在编译过程的最后一步。程序放入内存后 | 在将可执行文件和库添加到内存时,在链接过程中添加共享库。 |
手段 | 由链接器执行 | 由操作系统执行 |
空间 | 静态库的大小要大得多,因为外部程序是在可执行文件中构建的。 | 动态库要小得多,因为只有一个动态库副本保存在内存中。 |
外部文件更改 | 如果对外部文件应用了任何更改,则必须重新编译可执行文件。 | 在共享库中,无需重新编译可执行文件。 |
加载时间 | 时间更长,因为每次执行时都会加载到内存中。 | 它更快,因为共享库代码已经在内存中。 |
兼容性 | 从来没有兼容性问题,因为所有代码都在一个可执行模块中。 | 程序取决于具有兼容的库。如果从系统中删除库,则从属程序将不起作用。 |
分别什么时候使用他们?
如果你有很多文件,静态库的多个副本意味着可执行文件的大小增加,那就建议使用动态库,可以节省时间。如果执行时间的好处超过节省空间的需要,那么静态库就是最佳选择。