Dll与.so或.dylib(MacOS)文件所使用的机制几乎相同,因此很难确切解释它们之间的区别。

核心区别在于每种文件类型默认情况下可见的内容。.so文件导出语言(gcc)级链接-这意味着(默认情况下)拉入.so时(默认情况下)所有“外部”的C&c++符号都可用于链接。这也意味着,解析.so文件本质上是一个链接步骤,加载程序不关心符号来自哪个.so文件。它仅遵循.a文件遵循的常规链接步骤规则,以某种顺序搜索指定的.so文件。

另一方面,Dll文件是一种操作系统功能,与语言的链接步骤完全分开。MSVC使用.lib文件来链接静态库和动态库(每个dll文件都会生成一个用于链接的成对的.lib文件),因此,一旦生成该程序,就将其完全“链接”(从语言中心角度)。。

但是,在链接阶段,会在代表Dll的库中解析符号,从而允许链接程序在PE文件中构建导入表,其中包含dll的显式列表以及每个dll中引用的入口点。在加载时,Windows不必执行“链接”来解析共享库中的符号:该步骤已经完成-Windows加载器仅加载dll并直接连接函数