厦门做企业网站的公司,网址自动生成手机网站,设计官网费用,佛山网站设计定制DLL1调用lib#xff0c;lib调用DLL2
问题1#xff1a;为什么在dll1中需要引入dll2的.lib文件
当你有一个工程#xff08;dll1#xff09;调用静态库#xff08;lib#xff09;#xff0c;而静态库#xff08;lib#xff09;又调用另一个DLL#xff08;dll2#xf…DLL1调用liblib调用DLL2
问题1为什么在dll1中需要引入dll2的.lib文件
当你有一个工程dll1调用静态库lib而静态库lib又调用另一个DLLdll2中的函数时dll1需要引入dll2的.lib文件。这是因为静态库只是一个函数和数据的集合它们的实现依赖于你链接到的其他库或DLL。在这种情况下
lib调用dll2中的函数lib中的函数实现依赖于dll2提供的函数。dll1调用lib中的函数dll1链接到lib但lib中的函数实现依赖于dll2。
因此dll1在链接时需要知道dll2中的符号。这就要求在dll1的链接器输入中包含dll2的.lib文件。
问题2DLL工程为什么生成一个DLL文件还生成了一个lib文件
当你构建一个DLL工程时生成两个文件是正常的一个DLL文件和一个.lib文件。它们的用途如下 DLL文件动态链接库 这是实际的动态链接库文件包含了你的程序可以在运行时加载并使用的实际代码和数据。它在运行时被加载到内存中并通过导出的函数和数据与其他程序进行交互。 LIB文件导入库 这是一个导入库文件包含了DLL导出的符号函数和变量的列表。在编译和链接过程中链接器使用这个.lib文件来解析对DLL中符号的引用。它告诉链接器哪些符号在DLL中以及如何找到它们。导入库文件不包含实际的代码或数据只包含符号的引用。
实际操作示例
假设有以下三个工程
DLL1使用lib间接调用DLL2LIB调用DLL2DLL2提供函数实现
DLL2 工程
DLL2.h
#pragma once#ifdef BUILDING_DLL2
#define DLL2_PUBLIC __declspec(dllexport)
#else
#define DLL2_PUBLIC __declspec(dllimport)
#endifextern C DLL2_PUBLIC int dll2Function();DLL2.cpp
#include DLL2.hint dll2Function() {return 42;
}编译DLL2生成 DLL2.dll 和 DLL2.lib。
DLL2工程配置预处理器定义加入
DLL2_PUBLIC LIB 工程
Lib.h
#pragma onceint libFunction();Lib.cpp
#include Lib.h
#include DLL2.hint libFunction() {return dll2Function() 100;
}编译LIB工程生成 Lib.lib。
DLL1 工程
DLL1.h
#pragma once#ifdef BUILDING_DLL1
#define DLL1_PUBLIC __declspec(dllexport)
#else
#define DLL1_PUBLIC __declspec(dllimport)
#endifextern C DLL1_PUBLIC int dll1Function();DLL1.cpp
#include DLL1.h
#include Lib.hint dll1Function() {return libFunction() 10;
}在DLL1工程中配置 包含路径 项目属性 - VC目录 - 包含目录中添加 ../Lib 和 ../DLL2。 库目录 项目属性 - VC目录 - 库目录中添加 ../Lib/build 和 ../DLL2/build。 附加依赖项 项目属性 - 链接器 - 输入 - 附加依赖项中添加 Lib.lib 和 DLL2.lib。
通过这些配置dll1工程在链接时可以解析lib中的符号而lib中的符号依赖于dll2中的符号这些符号通过dll2的.lib文件提供。
总结
引入顺序当一个DLL调用一个静态库而静态库又依赖另一个DLL时调用链中的所有DLL的.lib文件都需要在**最外层工程中引入。**生成两个文件的原因DLL工程生成的DLL文件用于运行时而lib文件用于链接时解析符号引用。