Visual C++:什么是动态链接的.lib文件?

Visual C++:什么是动态链接的.lib文件?

问题描述:

我注意到了有关我用一个库中的以下内容:Visual C++:什么是动态链接的.lib文件?

  • 库被编译为的.lib文件
  • 我的代码需要编译为多线程(调试)DLL链接到这个库。

我打开的.sln(解决方案)的库(它是开源的)的档案,并在其项目属性如下:

  1. 运行库选项设置到多线程(Debug)DLL
  2. 配置类型设置为静态库(.LIB)

我的困惑是:

  1. 没有在上面的库选项冲突? (静态库说一个选项,DLL说另一个)
  2. 什么样的动物是.lib那就是动态链接?它与DLL有什么不同?

请注意,我知道Linux世界中的静态库和动态库之间的区别。

我不知道配置不匹配,但用.DLL库创建的.LIB文件是一个“导出库” - 它不包含任何代码,只是可调用函数的名称和DLL中的对象。链接器使用它来满足链接时的引用,这些引用在运行时通过动态加载最终解决。

+0

我无法在任何地方看到此库的任何DLL文件。然而,我的代码可以链接到.lib并执行!我错过了什么吗? – 2010-02-12 11:50:19

+0

@Ashwin听起来像你有一个静态库然后。最好的选择是使用Dependency Walker从http://dependencywalker.com/上免费获取一个免费工具来查看您的可执行文件,并查看实际依赖的内容。 – 2010-02-12 12:00:07

+0

Neil Butterworth:如果你很好奇,图书馆是wxWidgets。用Dependency Walker检查我的.exe文件,找不到任何wx * .dll。我的.exe被构建为多线程DLL&链接到wx * .lib。这怎么可能? :-) – 2010-02-12 12:07:29

“RunTime Library”选项与您的图书馆无关。它告诉编译器,你将在运行时从MSVCRTxx.DLL导入你的函数。

“配置类型”选项会引用您的库,因此独立于“运行时库”选项。

Windows DLL可以使用LoadLibrary(或LoadLibraryEx)API动态加载,但是必须使用GetProcAddress或GetProcAddressEx查找并将每个导出的函数绑定到函数指针。像往常一样,你最好能够正确使用函数签名,否则会发生不好的事情。

LIB文件允许Windows在您的EXE启动时(包括查找使用哪个DLL以及递归加载相关的DLL)为您执行所有操作,在运行时静态链接动态库,同时避免膨胀您的EXE文件与可执行代码,并允许多个进程在内存中共享相同的DLL映像。