如果我有一个项目,我有两个模块A
和B
,并且它们都链接到第三个库C
。
如果C
是静态库,那么来自C
和A
的{{1}}的调用是否保持单独的状态{{1} }?他们有不同的堆吗?
另一方面,如果B
是共享库,那么C
和C
可以访问共享状态A
?
P.S。应用程序入口点位于B
或C
。
答案 0 :(得分:2)
这取决于您的操作系统以及用于编译的选项 链接。在Unix下,默认情况下,所有常见符号都在两个或更多 共享库将解析为第一个库中的名称 装;对于大多数Unices,这适用于主要的名称 好吧(但Linux中使用的GNU链接器需要一个特殊选项 为了这)。在Windows下,它有点棘手;每个人静态地 链接库将拥有自己的州和国家副本 没有简单的解决方法,除了创建第三个DLL来包装 静态库,只能通过其中的符号访问它 DLL。
答案 1 :(得分:1)
从应用程序的角度来看,静态链接与动态链接对链接库的状态管理没有任何影响。该库具有单个状态,所有相关模块都受其约束。
我认为你感到困惑的是优化,静态链接与动态链接允许操作系统。动态库可以加载到内存中一次,并为使用它的每个进程进行不同的映射。这样就无需加载已加载的页面的精确副本。