vs 2008调用lib 和 dll

本文介绍了DLL和LIB文件的区别,DLL在运行时动态加载,而LIB在编译时被包含。在Visual Studio 2008中调用第三方库的步骤包括设置附加包含目录、附加库目录和附加依赖项。使用LIB时需要.h和.LIB文件,而使用DLL则还需DLL文件,且可选择使用LoadLibrary和GetProcAddress动态加载。

1. DLL 和 lib 文件的区别:

      DLL编译时并不包含到调用的exe中,运行时动态加载;所以如果DLL中的实现发生了变化,只需单独编译发行DLL。

      lib 编译时包含到生成的exe中,运行时不再需要.lib文件,如果lib实现发生了变化,必须重新编译exe。


 2. Visual Studio 2008中调用第三方的lib, dll文件,参数配置:

        a. 项目属性 -> c/c++ -> 常规 -> 附加包含目录     添加所需的.h文件所在目录。

        b. 项目属性 -> 链接器 -> 常规 -> 附加库目录      添加.lib文件所在目录。

在 Visual Studio (VS) 中使用 C++ 调用 `.lib` `.dll` 是 Windows 平台下常见的模块化开发方式。`.dll`(动态链接库)包含可执行代码,而 `.lib` 文件可能是静态库,也可能是用于导入 DLL 的“导入库”(import library)。下面详细介绍如何在 VS调用这两种类型的库。 --- ### 一、调用静态库(Static Library) #### 1. 创建静态库(.lib) 假设你有一个静态库项目 `MyLib`,它提供一个函数: ```cpp // MyLib.h #pragma once int add(int a, int b); ``` ```cpp // MyLib.cpp #include "MyLib.h" int add(int a, int b) { return a + b; } ``` - 在 VS 中创建一个 **Static Library** 项目,编译后生成 `MyLib.lib` 对应的头文件。 #### 2. 在主项目中调用静态库 ##### 步骤: 1. 将 `MyLib.h` 添加到主项目包含路径。 2. 将 `MyLib.lib` 放在项目目录,并配置链接器。 3. 配置项目属性: - **项目属性 → VC++ 目录 → 包含目录**:添加头文件路径。 - **项目属性 → VC++ 目录 → 库目录**:添加 `.lib` 文件所在路径。 - **项目属性 → 链接器 → 输入 → 附加依赖项**:添加 `MyLib.lib`。 ##### 使用代码: ```cpp // main.cpp #include <iostream> #include "MyLib.h" #pragma comment(lib, "MyLib.lib") // 可选:代替手动设置附加依赖项 int main() { std::cout << "5 + 3 = " << add(5, 3) << std::endl; return 0; } ``` > ✅ 静态库的代码会被直接链接进最终的可执行文件。 --- ### 二、调用动态链接库(DLLDLL 分为两种调用方式:**隐式链接(通过 .lib)** **显式加载(通过 LoadLibrary)** #### 方法 1:隐式链接(推荐,简单) ##### 1. 创建 DLL 项目 ```cpp // MathDll.h #pragma once #ifdef MATHDLL_EXPORTS #define MATHAPI __declspec(dllexport) #else #define MATHAPI __declspec(dllimport) #endif MATHAPI int multiply(int a, int b); ``` ```cpp // MathDll.cpp #include "MathDll.h" int multiply(int a, int b) { return a * b; } ``` - 创建一个 **Dynamic-Link Library (DLL)** 项目,编译后生成: - `MathDll.dll` - `MathDll.lib`(导入库) - `MathDll.h` ##### 2. 主程序调用 DLL(隐式链接) ###### 配置步骤: - 包含目录:添加 `MathDll.h` 路径 - 库目录:添加 `.lib` 路径 - 链接器 → 输入 → 附加依赖项:添加 `MathDll.lib` - 或使用 `#pragma comment(lib, "...")` ###### 代码示例: ```cpp // main.cpp #include <iostream> #include "MathDll.h" #pragma comment(lib, "MathDll.lib") int main() { std::cout << "6 * 7 = " << multiply(6, 7) << std::endl; return 0; } ``` > ⚠️ 运行时需要将 `MathDll.dll` 放在可执行文件同一目录,或系统能找到的位置(如 PATH)。 --- #### 方法 2:显式加载 DLL(运行时加载) 不需要 `.lib` 文件,使用 Windows API 动态加载 DLL。 ```cpp // main_dynamic.cpp #include <iostream> #include <windows.h> // 定义函数指针类型 typedef int (*MultiplyFunc)(int, int); int main() { HMODULE hDll = LoadLibrary(L"MathDll.dll"); // 注意宽字符 if (!hDll) { std::cerr << "无法加载 DLL!" << std::endl; return 1; } MultiplyFunc multiply = (MultiplyFunc)GetProcAddress(hDll, "multiply"); if (!multiply) { std::cerr << "无法获取函数地址!" << std::endl; FreeLibrary(hDll); return 1; } std::cout << "8 * 9 = " << multiply(8, 9) << std::endl; FreeLibrary(hDll); // 卸载 DLL return 0; } ``` > ✅ 优点:灵活,可选择性加载; > ❌ 缺点:代码复杂,需处理错误。 --- ### 总结对比 | 方式 | 是否需要 .lib | 编译时链接 | 运行时依赖 | 灵活性 | |----------------|---------------|------------|------------|--------| | 静态库 | 是(.lib) | 是 | 否 | 低 | | DLL 隐式链接 | 是(导入库) | 是 | 是(.dll)| 中 | | DLL 显式加载 | 否 | 否 | 是(.dll)| 高 | --- ### 常见问题与解决 - **LNK2019 错误**:找不到符号 → 检查 `.lib` 是否正确链接。 - **找不到 DLL**:确保 `.dll` 在运行目录或系统路径中。 - **C++ 名称修饰(Name Mangling)**:如果 C++ 函数被修饰,可用 `extern "C"` 防止修饰(适用于显式加载): ```cpp // 在 DLL 中导出 C 风格函数名 extern "C" MATHAPI int multiply(int a, int b); ``` 这样 `GetProcAddress` 才能通过 `"multiply"` 找到函数。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值