2012-11-07 117 views
3

在Visual Studio 2010我建立项目作为动态库(说dyn1.dll)这是使用另一个DLL(说dyn2.lib,dyn2.dll,dyn2.h是各自文件)。我直接在我的项目中包含dyn2.h和dyn2.lib。并设置“路径”变量指向dyn2.dll所在的位置。这是我遵循的使dyn1.dll工作的过程。静态和动态库链接在Visual Studio C++

现在说我建立我的项目作为静态库(说sta1.lib),同时仍然使用dyn2.dll,dyn2.h和dyn2.lib。是包含在sta1.lib内的dyn2.lib,dyn2.dll中包含的所有代码。

意思是sta.lib standalone。我不需要指向sta1.lib的路径变量中的dyn2.dll的目录吗?我是新来的这些所谓澄清的答案将是非常有益

感谢

回答

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必须先前一样。