在编程上下文库中是一种具有某种代码的东西,这些代码已经过预编译,可以在任何程序中重新使用以实现某些特定功能或特性。
现在,根据该代码库的执行和存储,将其分为两种类型,即静态库和共享库。
以下是静态库和共享库之间的重要区别。
序号 | 要点 |
静态库 | 共享库 |
---|---|---|---|
1 | 定义 | 静态库是一个库,其中执行文件的所有代码都在一个可执行文件中,该文件通过编译器、链接器或绑定器复制到目标应用程序中,从而生成一个目标文件和一个独立的可执行文件。 |
另一方面,共享库是在目标程序中仅提及库地址的库,而库的所有功能和代码都位于内存空间中的特殊位置,并且每个程序都可以访问它们,而不必具有多个副本他们。 |
2 | 导入 | 如上 ,静态库在编译时在调用程序中解析,并由编译器、链接器或绑定器复制到目标应用程序中。 |
共享库是在操作系统执行目标程序时导入的。 |
3 | 大小 | 静态库很大,因为外部程序是在可执行文件中构建的。 |
在其他共享库上,它要小得多,因为在执行时只有一个动态库副本保留在内存中,否则它的位置是远程的。 |
4 | 汇编 | 对于静态库,如果对外部文件应用了任何更改,则需要重新编译。 |
另一方面,对于共享库,无需重新编译可执行文件。 |
5 | 性能 | 静态库的执行时间较长,因为每次执行时都会加载到内存中。 |
虽然共享库更快,因为共享库代码已在内存中。 |
6 | 兼容性 | 静态库的执行时间较长,因为每次执行时都会加载到内存中。 |
另一方面,如果共享库存在兼容性问题,因为如果从系统中删除了库,则目标程序将无法工作。 |
问题内容: 我参与了有关Linux库的一些辩论,并想确认一些事情。 以我的理解(如果我做错了请纠正我,稍后我将编辑我的文章)在构建应用程序时有两种使用库的方式: 静态库(.a文件):在链接时,会将整个库的副本放入最终应用程序中,以便调用方应用程序始终可以使用库中的功能 共享对象(.so文件):在链接时,仅通过相应的标头(.h)文件针对其API验证了对象。该库直到需要运行时才真正使用。 静态库的明显
问题内容: 我有一个项目,其中有一个静态库,另一个有我的实际共享库。我的目标是链接到。在Linux / BSD上可以吗?尝试创建测试程序时,出现以下错误: ./prog1:/usr/local/lib/libtestlib.so.1.0:未定义的符号’‘ 我的猜测是,这是因为libhelper.a不是用while 编译的。使用共享库(也依赖于静态库)来构建程序的正确方法是什么? 谢谢! 问题答案:
问题内容: 我有一个第三方库,主要由大量的静态()库文件组成。我可以将其编译为单个库文件,但我确实需要将其作为单个共享库文件。 有什么方法可以将静态文件转换为共享文件?或更笼统地说,是否有一种将大量静态文件和一些目标文件合并为一个文件的好方法? 问题答案: 是否这样做(当然带有适当的-L) 不是吗
问题内容: 此Java程序包含一个静态变量。但是我无法理解公共静态变量和私有静态变量之间的区别。 问题答案: 公共变量可在代码中的 任何 位置访问- 私有变量仅可在类本身内部访问。在这种情况下,您可以在类中使用它,所以很好。 请注意,静态变量是完全独立的问题-方法和类具有与变量相同的可访问性。 还有其他级别的访问权限- 和默认的“包”访问权限(无法明确指定)。有关更多详细信息,请参见Java语言规
这个java程序包含一个静态变量。但是我不明白公共和私有静态变量之间的区别。
问题内容: 如何在gcc中静态链接共享库函数? 问题答案: 参考: http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static- linking-of-shared- libraries-696714/ http://linux.derkeiler.com/Newsgroups/comp.os.linux.develo