Visual C++:什么是动态链接的.lib文件?
问题描述:
我注意到了有关我用一个库中的以下内容:Visual C++:什么是动态链接的.lib文件?
- 库被编译为的.lib文件。
- 我的代码需要编译为多线程(调试)DLL链接到这个库。
我打开的.sln(解决方案)的库(它是开源的)的档案,并在其项目属性如下:
- 运行库选项设置到多线程(Debug)DLL。
- 配置类型设置为静态库(.LIB)
我的困惑是:
- 没有在上面的库选项冲突? (静态库说一个选项,DLL说另一个)
- 什么样的动物是.lib那就是动态链接?它与DLL有什么不同?
请注意,我知道Linux世界中的静态库和动态库之间的区别。
答
我不知道配置不匹配,但用.DLL库创建的.LIB文件是一个“导出库” - 它不包含任何代码,只是可调用函数的名称和DLL中的对象。链接器使用它来满足链接时的引用,这些引用在运行时通过动态加载最终解决。
答
“RunTime Library”选项与您的图书馆无关。它告诉编译器,你将在运行时从MSVCRTxx.DLL
导入你的函数。
“配置类型”选项会引用您的库,因此独立于“运行时库”选项。
答
Windows DLL可以使用LoadLibrary(或LoadLibraryEx)API动态加载,但是必须使用GetProcAddress或GetProcAddressEx查找并将每个导出的函数绑定到函数指针。像往常一样,你最好能够正确使用函数签名,否则会发生不好的事情。
LIB文件允许Windows在您的EXE启动时(包括查找使用哪个DLL以及递归加载相关的DLL)为您执行所有操作,在运行时静态链接动态库,同时避免膨胀您的EXE文件与可执行代码,并允许多个进程在内存中共享相同的DLL映像。
我无法在任何地方看到此库的任何DLL文件。然而,我的代码可以链接到.lib并执行!我错过了什么吗? – 2010-02-12 11:50:19
@Ashwin听起来像你有一个静态库然后。最好的选择是使用Dependency Walker从http://dependencywalker.com/上免费获取一个免费工具来查看您的可执行文件,并查看实际依赖的内容。 – 2010-02-12 12:00:07
Neil Butterworth:如果你很好奇,图书馆是wxWidgets。用Dependency Walker检查我的.exe文件,找不到任何wx * .dll。我的.exe被构建为多线程DLL&链接到wx * .lib。这怎么可能? :-) – 2010-02-12 12:07:29