静态库和共享库有什么区别?
我使用 Eclipse,有几种项目类型,包括静态库和共享库?一个比另一个有优势吗?
共享库是 .so(或 Windows .dll 或 OS X .dylib)文件。所有与库相关的代码都在这个文件中,并且在运行时被使用它的程序引用。使用共享库的程序只引用它在共享库中使用的代码。
静态库是 .a(或 Windows 中的 .lib)文件。所有与库相关的代码都在这个文件中,并且在编译时直接链接到程序中。使用静态库的程序从静态库中获取它使用的代码的副本,并使其成为程序的一部分。[Windows 也有用于引用 .dll 文件的 .lib 文件,但它们的作用与第一个相同]。
每种方法都有优点和缺点:
共享库减少了每个使用该库的程序中重复的代码量,从而使二进制文件保持较小。它还允许您将共享对象替换为功能等效的共享对象,但可能会增加性能优势,而无需重新编译使用它的程序。然而,共享库会为函数的执行带来少量额外成本,以及运行时加载成本,因为库中的所有符号都需要连接到它们使用的东西。此外,共享库可以在运行时加载到应用程序中,这是实现二进制插件系统的一般机制。
静态库会增加二进制文件的整体大小,但这意味着您不需要携带正在使用的库的副本。由于代码在编译时连接,因此没有任何额外的运行时加载成本。代码就在那里。
个人比较喜欢共享库,但是在需要保证二进制没有太多可能难以满足的外部依赖的时候使用静态库,比如特定版本的C标准库或者特定版本的Boost C库。