0

我注意到有关我使用的库的以下内容:

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

我打开库的.sln(解决方案)文件(它是开源的)并在其项目属性中看到以下内容:

  1. 运行时库选项设置为Multi-threaded (Debug) DLL
  2. 配置类型设置为静态库 (.lib)

我的困惑是:

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

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

4

3 回答 3

3

“运行时库”选项与您的库无关。它告诉编译器您将MSVCRTxx.DLL在运行时导入您的函数。

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

于 2010-02-12T12:19:23.350 回答
2

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

LIB 文件允许 Windows 在您的 EXE 启动时为您完成所有这些工作(包括查找要使用的 DLL,并递归加载依赖的 DLL),在运行时静态链接动态库,同时避免使用可执行代码使 EXE 文件膨胀, 并允许多个进程在内存中共享同一个 DLL 映像。

于 2010-02-12T12:29:39.003 回答
1

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

于 2010-02-12T11:45:18.113 回答