悠悠楠杉
网站页面
正文:
在Windows平台开发中,动态链接库(DLL)是实现代码复用和模块化的重要手段。本文将系统讲解C++动态库从开发到调用的完整流程,包含关键代码示例和实际应用场景分析。
动态库相比静态库具有显著优势:
1. 运行时加载:减少主程序体积,实现按需加载
2. 多进程共享:同一DLL可被多个进程共用,节省内存
3. 热更新能力:无需重新编译主程序即可更新功能模块
使用__declspec(dllexport)标记需要导出的函数:
// MathLibrary.h
#ifdef MATHLIBRARY_EXPORTS
#define MATHLIBRARY_API __declspec(dllexport)
#else
#define MATHLIBRARY_API __declspec(dllimport)
#endif
MATHLIBRARY_API int Add(int a, int b);
MATHLIBRARY_API double SquareRoot(double x);// MathLibrary.cpp
#include "MathLibrary.h"
#include <cmath>
int Add(int a, int b) {
return a + b;
}
double SquareRoot(double x) {
if (x < 0.0) return -1.0;
return sqrt(x);
}在Visual Studio中:
- 新建"动态链接库(DLL)"项目
- 配置属性 → C/C++ → 预处理器 → 添加MATHLIBRARY_EXPORTS
- 生成解决方案后得到.dll和.lib文件
.lib文件添加到项目依赖#include "MathLibrary.h"
#pragma comment(lib, "MathLibrary.lib")
int main() {
int sum = Add(3, 4); // 直接调用DLL函数
double root = SquareRoot(25.0);
return 0;
}特点:
- 需要头文件和导入库(.lib)
- 程序启动时自动加载DLL
- 调用方式与普通函数无异
通过Windows API动态加载:
#include <windows.h>
typedef int (*AddFunc)(int, int);
int main() {
HINSTANCE hDll = LoadLibrary(L"MathLibrary.dll");
if (hDll) {
AddFunc add = (AddFunc)GetProcAddress(hDll, "Add");
if (add) {
int result = add(5, 7);
}
FreeLibrary(hDll);
}
return 0;
}适用场景:
- 需要按需加载/卸载模块
- 实现插件系统架构
- 处理可能不存在的可选功能
class MATHLIBRARY_API Calculator {
public:
double Power(double base, double exp);
};注意:要求调用方使用相同编译器,避免内存布局差异
extern "C"避免名称改编:extern "C" MATHLIBRARY_API int __cdecl Add(int a, int b);- 保持导出函数参数不变
- 通过新函数添加功能而非修改原有函数
- 使用DEF文件精确控制导出符号
通过DLL实现进程间数据共享:
// SharedData.h
#pragma once
#ifdef SHAREDDATA_EXPORTS
#define SHAREDDATA_API __declspec(dllexport)
#else
#define SHAREDDATA_API __declspec(dllimport)
#endif
SHAREDDATA_API void SetSharedValue(int value);
SHAREDDATA_API int GetSharedValue();在DLL中定义共享段:
#pragma data_seg(".SHARED")
int g_sharedValue = 0;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.SHARED,RWS")