visual studio c ++中的静态和动态库链接

时间:2012-11-07 19:00:49

标签: c++ visual-studio-2010 dll static-libraries

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

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

意思是sta.lib独立。我不需要指向sta1.lib的路径变量中的dyn2.dll目录吗?我是新手,所以澄清答案会非常有帮助

感谢

1 个答案:

答案 0 :(得分: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必须先前一样。