Windows动态链接库详解:dll与lib功能与调用

2 下载量 13 浏览量 更新于2024-08-30 2 收藏 136KB PDF 举报
本文将详细介绍Windows系统中链接库的两种主要类型:静态链接库(lib)和动态链接库(dll)。动态链接库在开发过程中特别重要,因为它们允许程序在运行时加载和使用共享的代码模块,提高了效率和可维护性。 1. **链接库类型**: - **静态链接库**(.lib文件):在编译时与应用程序一同链接,包含函数和符号的实现,使用时不会出现运行时依赖问题。 - **动态链接库**(.dll文件):提供可重用的功能,编译时不直接包含代码,运行时通过系统查找并加载,节省空间,但可能导致性能损失(因为频繁加载/卸载)。 2. **动态链接库的结构**: - 动态链接库通常会附带一个引入库(.lib),这个库提供了dll中的导出函数和符号列表,方便其他程序在链接时找到对应函数映射。 3. **动态链接库调用方式**: - **隐式调用(静态导入调用)**:通过`extern`关键字导入函数,编译器在编译时处理,不涉及运行时动态查找。 - **显示调用(动态导入调用)**:使用`_declspec(dllimport)`进行导入声明,编译器在编译时不会处理,运行时通过`GetProcAddress`等函数查找并调用。 4. **DLL导出符号**: - 在示例中,`_declspec(dllexport)`用于标记dll1.dll中的导出函数`add`,导出符号包括:Ordinal(函数序号)、Hint(可能用于优化查找,非必须理解)、Function(函数名)、EntryPoint(函数在DLL中的地址)。 - 因为C++的重载功能,函数名前加上特定的符号(如`add(inta, intb)`),以便于在DLL内部唯一标识。 5. **测试和链接错误**: - 测试工程DllTest通过`_declspec(dllimport)`导入dll1.dll中的`add`函数,这比`extern`更高效。然而,在编译链接阶段,如果dll1.dll未被正确链接,会出现`LNK2019 unresolved external symbol`这样的链接错误,表示找不到对应的导出函数。 理解链接库在Windows编程中的角色及其不同类型的差异对于构建健壮的应用程序至关重要。熟练掌握动态链接库的使用、导出和导入机制,可以帮助开发者更好地管理代码复用和依赖关系。