TypechoJoeTheme

至尊技术网

统计
登录
用户名
密码

C++如何创建和使用动态库(DLL)_C++动态库开发与跨程序调用方法,c语言动态库的创建使用

2026-04-01
/
0 评论
/
5 阅读
/
正在检测是否收录...
04/01

正文:

在Windows平台开发中,动态链接库(DLL)是实现代码复用和模块化的重要手段。本文将系统讲解C++动态库从开发到调用的完整流程,包含关键代码示例和实际应用场景分析。


一、动态库的核心优势

动态库相比静态库具有显著优势:
1. 运行时加载:减少主程序体积,实现按需加载
2. 多进程共享:同一DLL可被多个进程共用,节省内存
3. 热更新能力:无需重新编译主程序即可更新功能模块


二、创建动态库(DLL)

1. 导出函数声明

使用__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);

2. 实现导出函数

// 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);
}

3. 编译生成DLL

在Visual Studio中:
- 新建"动态链接库(DLL)"项目
- 配置属性 → C/C++ → 预处理器 → 添加MATHLIBRARY_EXPORTS
- 生成解决方案后得到.dll.lib文件


三、调用动态库的两种方式

方式1:隐式链接(加载时链接)

  1. .lib文件添加到项目依赖
  2. 包含头文件直接调用函数:
#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
- 调用方式与普通函数无异

方式2:显式加载(运行时链接)

通过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;
}

适用场景
- 需要按需加载/卸载模块
- 实现插件系统架构
- 处理可能不存在的可选功能


四、高级技巧与注意事项

  1. 导出C++类
class MATHLIBRARY_API Calculator {
public:
    double Power(double base, double exp);
};

注意:要求调用方使用相同编译器,避免内存布局差异

  1. 解决名称修饰问题
    对于C++函数,使用extern "C"避免名称改编:
extern "C" MATHLIBRARY_API int __cdecl Add(int a, int b);
  1. 版本兼容策略

- 保持导出函数参数不变
- 通过新函数添加功能而非修改原有函数
- 使用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")
C++动态库DLL开发跨程序调用导出函数隐式链接显式加载
朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/43622/(转载时请注明本文出处及文章链接)

评论 (0)
37,868 文章数
92 评论量

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月