3

在visual studio 2010中,我将项目构建为一个动态库(比如dyn1.dll),它使用另一个dll(比如dyn2.lib、dyn2.dll、dyn2.h是各自的文件)。我将 dyn2.h 和 dyn2.lib 直接包含在我的项目中。并将“路径”变量设置为指向 dyn2.dll 所在的位置。这是我遵循使 dyn1.dll 工作的过程。

现在说我将我的项目构建为静态库(比如 sta1.lib),同时仍然使用 dyn2.dll、dyn2.h 和 dyn2.lib。是dyn2.lib中包含的所有代码,dyn2.dll并入sta1.lib中。

意思是 sta.lib 独立。我不需要指向路径变量中的 dyn2.dll 目录来使 sta1.lib 工作吗?我对这些不熟悉,所以一个澄清的答案会很有帮助

谢谢

4

1 回答 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 一样。

于 2012-11-07T19:08:25.760 回答