静态库和共享库之间的区别是什么?
我使用Eclipse,有几个项目类型,包括静态库和共享库?其中一种比另一种有优势吗?
静态库和共享库之间的区别是什么?
我使用Eclipse,有几个项目类型,包括静态库和共享库?其中一种比另一种有优势吗?
当前回答
-------------------------------------------------------------------------
| +- | Shared(dynamic) | Static Library (Linkages) |
-------------------------------------------------------------------------
|Pros: | less memory use | an executable, using own libraries|
| | | ,coming with the program, |
| | | doesn't need to worry about its |
| | | compilebility subject to libraries|
-------------------------------------------------------------------------
|Cons: | implementations of | bigger memory uses |
| | libraries may be altered | |
| | subject to OS and its | |
| | version, which may affect| |
| | the compilebility and | |
| | runnability of the code | |
-------------------------------------------------------------------------
其他回答
对于静态库,代码由链接器从库中提取,并在编译/构建应用程序时用于构建最终的可执行文件。最终的可执行文件在运行时不依赖于库
对于共享库,编译器/链接器在构建应用程序时检查所链接的名称是否存在于库中,但不会将它们的代码移到应用程序中。在运行时,共享库必须可用。
C编程语言本身没有静态库或共享库的概念——它们完全是一种实现特性。
就我个人而言,我更喜欢使用静态库,因为它使软件分发更简单。然而,这一观点在过去曾引发大量(象征性的)流血冲突。
在所有其他答案中,有一件事还没有被提及,那就是脱钩:
让我来谈谈我一直在处理的一个真实世界的生产代码:
一个非常大的软件,由>300个项目(visual studio)组成,主要构建为静态库,最后所有链接在一个巨大的可执行文件中,你最终会遇到以下问题:
-链接时间过长。你可能会有超过15分钟的链接,比如10秒的编译时间 -有些工具在处理这么大的可执行文件时是非常困难的,比如内存检查工具,它们必须检测代码。你可能会陷入被视为傻瓜的极限。
更有问题的是软件的解耦:在这个真实的例子中,任何其他项目都可以访问每个项目的头文件。因此,对于一个开发人员来说,添加依赖项非常容易;它只是包括标题,因为链接在最后将允许waws找到符号。它以可怕的循环依赖和完全混乱而告终。
使用共享库,需要做一些额外的工作,因为开发人员必须编辑项目构建系统来添加依赖库。我发现共享库代码往往提供更简洁的代码API。
A static library is like a bookstore, and a shared library is like... a library. With the former, you get your own copy of the book/function to take home; with the latter you and everyone else go to the library to use the same book/function. So anyone who wants to use the (shared) library needs to know where it is, because you have to "go get" the book/function. With a static library, the book/function is yours to own, and you keep it within your home/program, and once you have it you don't care where or when you got it.
-------------------------------------------------------------------------
| +- | Shared(dynamic) | Static Library (Linkages) |
-------------------------------------------------------------------------
|Pros: | less memory use | an executable, using own libraries|
| | | ,coming with the program, |
| | | doesn't need to worry about its |
| | | compilebility subject to libraries|
-------------------------------------------------------------------------
|Cons: | implementations of | bigger memory uses |
| | libraries may be altered | |
| | subject to OS and its | |
| | version, which may affect| |
| | the compilebility and | |
| | runnability of the code | |
-------------------------------------------------------------------------
+---------------+---------------------------+------------------------------+
| properties | Static library | Shared library |
+===============+===========================+==============================+
| Linking time | It happens as the | Shared libraries |
| | last step of the | are added during |
| | compilation process. | linking process |
| | After the program | when executable |
| | is placed | file and libraries |
| | in the memory | are added to the memory. |
+---------------+---------------------------+------------------------------+
| Means | Performed by linkers | Performed by operating System|
+---------------+---------------------------+------------------------------+
| Size | Static libraries are | Dynamic libraries are |
| | much bigger in size, | much smaller, because |
| | because external | there is only one copy |
| | programs are built | of dynamic library |
| | in the executable file. | that is kept in memory. |
+---------------+---------------------------+------------------------------+
| External file | Executable file will | In shared libraries, |
| changes | have to be recompiled | no need to recompile |
| | if any changes were | the executable. |
| | applied to external files.| |
+---------------+---------------------------+------------------------------+
| Time | Takes longer to execute | It is faster |
| | because loading into the | because shared |
| | memory happens every time | library code is |
| | while executing. | already in the memory. |
+---------------+---------------------------+------------------------------+
| Compatibility | Never has a compatibility | Programs are dependent |
| | issue,since all code is | on having a compatible |
| | in one executable module. | library.Dependent program |
| | | will not work if library |
| | | gets removed from the system |
+---------------+---------------------------+------------------------------+