Visual Studio C++ 中的静态和动态库链接

3
在Visual Studio 2010中,我将项目构建为动态库(称为dyn1.dll),该库使用另一个dll文件(称为dyn2.lib,dyn2.dll和dyn2.h分别是相应的文件)。我直接包含dyn2.h和dyn2.lib并设置"Path"变量以指向dyn2.dll所在的位置。这是我使dyn1.dll工作的过程。
现在假设我将项目构建为静态库(称为sta1.lib),仍然使用dyn2.dll、dyn2.h和dyn2.lib。那么dyn2.lib和dyn2.dll中的所有代码是否都已包含在sta1.lib中?
也就是说,sta1.lib是独立的吗?我不需要在path变量中指定dyn2.dll的目录才能让sta1.lib正常工作吗?我对此很新,请给出一个解释性的答案,谢谢。
1个回答

3
简单的回答是“不”。dyn2.dll中的代码没有包含在您的静态dyn1.lib(sta1.lib)中。实际上,您将不得不链接dyn2.lib到任何现在使用您的静态sta1.lib的项目中,否则您将遇到未解决的链接器错误。
这并不是说您的静态库没有引用dyn2.dll中的代码;它确实有。但作为一个静态库,它没有PE模块。它只是一组带有外部引用的.obj代码模块。那些对dyn2.dll的外部引用仍然需要由使用来自您的静态库的代码的人解决,而这些代码又引用了dyn2.dll。静态库没有“链接时”解析。这只会在链接最终PE(无论是DLL还是EXE)时发生。事情仍然需要在最终链接时进行修复。
因此,回答您的第二个问题。在任何情况下(静态或动态),您的最终可执行文件仍然需要加载访问dyn2.dll,无论它在哪里。此外,它现在还必须链接dyn2.dll导入库(dyn2.lib),就像您的dyn1.dll之前必须链接一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接