2014-07-09 32 views
0

如果我有一个项目,其中有两个模块AB,并且它们都与第三个库C链接。动态库vs运行时的静态库

这是真的,如果CAB静态库,然后调用C由各自保持的C一个独立的国家?他们有不同的堆?

在另一方面,如果C是一个共享库,然后AB将有机会获得的C共享状态?

p.s.应用程序入口点位于AB

+0

它非常依赖于您的操作系统。 Windows DLL与\ * nix共享对象的工作方式非常不同,并且\ nix和链接方法的所有风格都没有单一工作模式。 –

回答

2

这取决于你的操作系统,以及你用来编译链接的选项和 链接。在Unix下,默认情况下,两个或多个共享库中的所有常用符号将解析为加载的第一个库 中的名称;对于大多数Unices而言,这适用于主井名称为 的井(但在Linux中使用的GNU链接程序需要特殊选项 )。在Windows下,这有点棘手;每个静态链接库都会拥有自己的状态副本,并且不会有简单的解决方法,除了创建第三个DLL来包装 静态库,并且只能通过该DLL中的符号访问它。

+0

我在OS X 10.8上使用xcode 5编译系统提供的铛。我在哪里可以找到将常用符号解析为相同名称所需的标志? – Enzo

+0

**使用动态库**。让它与静态链接一起工作涉及不必要的黑客行为。别。 –

+0

好的:)感谢您的建议! – Enzo

1

从应用程序的角度来看,静态链接与动态链接不会对链接库的状态管理产生影响。该库具有单一状态,并且所有相关模块都受其支配。

我认为你会感到困惑的是静态链接和动态链接允许操作系统的优化。一个动态库可以加载到内存中一次,并为每个使用它的进程映射不同。这消除了加载已经加载的页面的精确副本的需要。

+0

嗯没关系。这很奇怪,因为在我的应用程序中,我遇到了一个问题,即从模块B访问的状态是好的,但是如果我尝试从模块A访问它们,则它会被损坏。 – Enzo

+0

有人建议我将C构建为共享库而不是静态库。 – Enzo

+0

它是什么平台?它是一个多线程应用程序吗? –