2010-09-04 367 views
0

我是新来的Windows概念。我试图开发一个动态链接到其他DLL的DLL。我正在使用Visual Studio 2010.在连接时,Visual Studio告诉我它试图链接一堆.lib文件。我不认为Visual Studio应该尝试读取任何.LIB文件,如果我想我的代码执行动态链接是正确的?或者我不明白使用.LIB文件是否足够?Visual Studio DLL项目与DLL依赖项,无法解析的外部符号

谢谢

回答

1

我记得,Visual Studio的编译器对存根.lib文件链接解决.dll文件。

检查,其中一个应该是kernel32.lib。

+1

是的,它检查kernel32.lib和其他各种。但是我有编译/链接的外部依赖库。它也需要这些.lib文件。我有.lib文件,但我不希望它执行与我的静态链接,认为它正在执行动态链接...我确定有一个标志/设置,我可以检查以确保我的项目是__ONLY__执行动态链接...你知道那个设置/标志是什么吗? – 2010-09-04 21:51:01

+0

链接的种类由您链接的.lib文件的种类定义。那是静态的.lib还是动态库?很容易判断,静态.lib与.dll相比非常小。 – Joshua 2010-09-05 00:05:58

4

我的理解是,你有点困惑,因为你想使用DLL而不是LIB。

诀窍是Kernel32.Lib,User32.Lib,AdvAPI32.Lib等等没有你所使用的函数的实现。此外,如果在程序中使用诸如CreateFileWMessageBoxW之类的函数,编译后将无法解析该函数​​的引用。因此,如果没有LIB,未解决的引用将保留在EXE中。这将是不好的原因。为了可执行,EXE必须已经解析了所有的外部引用,并且确切地知道哪些函数应该在哪个DLL中找到。如此命名导入库有助于解决问题。例如,导入库Kernel32.Lib具有关于CreateFileW函数的信息,User32.Lib具有关于MessageBoxW的信息。如果您使用像Kernel32.Lib,User32.Lib,AdvAPI32.Lib这样的导入库列表,则EXE将解析所有引用并包含它需要的DLL的确切列表,以及在特殊的导入中对应的DLL中使用的函数列表表(见http://en.wikipedia.org/wiki/Portable_Executable#Import_Table,http://msdn.microsoft.com/en-us/library/ms809762.aspxhttp://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx)。所以,如果一个人启动了你的EXE,操作系统会在进程的地址空间中加载这个DLL,并解析所有引用直到所有使用的函数的地址。

当一个DLL编译时,通常会由链接器(link.exe)创建导入库。关于lib.exe实用程序,也可以创建一个对应于DLL的导入库。 (见http://msdn.microsoft.com/en-us/library/0b9xe492.aspx

相关问题