跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
MATLAB / Octave算法

Windows 下 MATLAB 与 C/C++ 混合编程:DLL 生成与调用

Windows 环境下 MATLAB 与 C/C++ 混合编程通过动态链接库(DLL)实现。流程包括使用 Visual Studio 编写并编译 C/C++ 源码生成 DLL,利用 MATLAB 的 loadlibrary 函数加载接口,并通过 calllib 调用函数。需注意 MATLAB 列优先与 C/C++ 行优先的存储差异,进行矩阵转置处理。结构体传递需使用 libstruct 转换。此外,应做好内存管理,及时卸载 DLL,并对比 MEX 文件方案选择合适路径。

信号故障发布于 2026/3/22更新于 2026/9/1061 浏览
Windows 下 MATLAB 与 C/C++ 混合编程:DLL 生成与调用

Windows 下 MATLAB 与 C/C++ 混合编程:DLL 生成与调用

在科学计算与工程开发中,MATLAB 凭借其便捷的矩阵运算和可视化能力广受青睐,但面对大规模数据处理或高性能算法时,C/C++ 的执行效率优势无可替代。将二者结合,通过动态链接库(DLL) 实现混合编程,既能发挥 MATLAB 的易用性,又能借助 C/C++ 提升核心代码性能。

一、核心原理与准备工作

1. 核心逻辑

C/C++编译生成的 DLL 文件包含可被外部程序调用的函数,通过__declspec(dllexport)声明导出函数,并使用extern "C"指定 C 链接规范,避免 C++ 的名称修饰(name mangling)问题,确保 MATLAB 能正确识别函数名。

MATLAB 通过loadlibrary函数加载 DLL,解析函数接口后,使用calllib函数调用目标函数,实现数据交互。

2. 环境准备
  • 编译器:Visual Studio 2019/2022(推荐,需安装 C/C++ 开发工具包)
  • MATLAB:R2020b 及以上版本(需配置支持 C/C++ 混合编程)
  • 辅助工具:Visual Studio 的x64 Native Tools Command Prompt(用于编译 DLL,匹配 MATLAB 的 64 位架构)

二、Step 1:编写 C/C++ 函数并编译为 DLL

1. 编写 C/C++ 源码:实现矩阵加法与结构体处理

创建名为MatlabCppMix.h的头文件和MatlabCppMix.cpp的源文件,实现两个核心功能:

  • 矩阵加法运算(double 类型二维数组)
  • 结构体数据的读取与修改(演示复杂数据类型传递)
头文件 MatlabCppMix.h
#ifndef MATLAB_CPP_MIX_H
#define MATLAB_CPP_MIX_H
// 声明结构体:用于演示复杂数据类型传递
typedef struct {
    double x; // 横坐标
    double y; // 纵坐标
    char label[20]; // 标签
} PointData;

// 导出函数声明:extern "C" 避免名称修饰,__declspec(dllexport) 导出函数
#ifdef __cplusplus
extern "C" {
#endif

// 功能 1:矩阵加法,输入两个 m×n 的矩阵,输出结果矩阵
__declspec(dllexport) void MatrixAdd(double* A, double* B, double* C, int m, int n);

// 功能 2:修改结构体数据,将 PointData 的 x、y 坐标放大 scale 倍
__declspec(dllexport) void ScalePoint(PointData* point, double scale);

#ifdef __cplusplus
}
#endif
#endif
源文件 MatlabCppMix.cpp
#include "MatlabCppMix.h"
#include <string.h>

// 矩阵加法实现:C = A + B
void MatrixAdd(double* A, double* B, double* C, int m, int n) {
    for (int i = 0; i < m * n; i++) {
        C[i] = A[i] + B[i];
    }
}

// 结构体数据缩放:point->x = point->x * scale; point->y = point->y * scale
void ScalePoint(PointData* point, double scale) {
    if (point == nullptr) {
        return; // 空指针判断,避免内存错误
    }
    point->x *= scale;
    point->y *= scale;
    // 标签追加"_scaled"
    strcat_s(point->label, sizeof(point->label), "_scaled");
}
2. 编译生成 DLL(Visual Studio 两种方法)
方法 1:使用 Visual Studio 图形界面编译(推荐新手)
  1. 打开 Visual Studio,创建新项目 → 选择动态链接库(DLL) → 项目命名为MatlabCppMix。
  2. 将上述MatlabCppMix.h和MatlabCppMix.cpp添加到项目中。
  3. 配置项目属性:
    • 右键项目 → 属性 → 配置属性 → 常规 → 平台工具集选择对应 VS 版本(如v143)。
    • 配置属性 → C/C++ → 所有选项 → 确保平台为x64(必须与 MATLAB 位数一致)。
    • 配置属性 → 链接器 → 高级 → 目标文件扩展名为.dll。
  4. 点击生成 → 生成解决方案,在x64/Debug或x64/Release目录下生成MatlabCppMix.dll。
方法 2:使用命令行编译(适合开发者)

打开x64 Native Tools Command Prompt,切换到源码目录,执行以下命令:

cl /LD MatlabCppMix.cpp /Fe:MatlabCppMix.dll 
  • /LD:指定编译为动态链接库。
  • /Fe:指定输出 DLL 文件名。

编译成功后,会生成MatlabCppMix.dll、MatlabCppMix.lib和MatlabCppMix.exp文件。

三、Step 2:MATLAB 中加载 DLL 并调用函数

1. 核心函数说明
函数功能
loadlibrary('dll 路径', '头文件路径')加载 DLL 并解析函数接口
calllib('dll 名称', '函数名', 参数列表)调用 DLL 中的指定函数
unloadlibrary('dll 名称')卸载 DLL,释放内存
libfunctions('dll 名称', '-full')查看 DLL 中所有导出函数的接口信息
2. MATLAB 脚本实现:数据传递与函数调用

创建CallDllDemo.m脚本,实现矩阵加法和结构体处理的完整调用流程,包含错误处理和内存管理。

% MATLAB 调用 C/C++ DLL 实战脚本
clear; clc; close all;

%% 1. 配置路径与参数
dllPath = 'MatlabCppMix.dll'; % DLL 文件路径(建议使用绝对路径)
hFile = 'MatlabCppMix.h'; % 头文件路径
m = 2; n = 3; % 矩阵维度:2 行 3 列

%% 2. 加载 DLL(含错误处理)
if ~libisloaded('MatlabCppMix')
    try
        loadlibrary(dllPath, hFile);
        disp('DLL 加载成功!');
        % 查看导出函数接口
        libfunctions('MatlabCppMix','-full');
    catch ME
        error('DLL 加载失败:%s', ME.message);
    end
end

%% 3. 调用函数 1:矩阵加法(double 数组传递)
try
    % 构造输入矩阵
    A = rand(m, n);
    B = rand(m, n);
    % 初始化输出矩阵(必须预分配内存)
    C = zeros(m, n);
    % 调用 DLL 中的 MatrixAdd 函数
    % 注意:MATLAB 矩阵是列优先存储,C/C++ 是行优先存储,需转置后传递!
    calllib('MatlabCppMix','MatrixAdd', A', B', C', m, n);
    C = C'; % 转置回 MATLAB 列优先格式
    % 输出结果
    disp('===== 矩阵加法结果 =====');
    disp('矩阵 A:');
    disp(A);
    disp('矩阵 B:');
    disp(B);
    disp('矩阵 C = A + B:');
    disp(C);
catch ME
    warning('矩阵加法调用失败:%s', ME.message);
end

%% 4. 调用函数 2:结构体数据处理
try
    % 定义 MATLAB 结构体,与 C/C++ 的 PointData 对应
    point = struct('x',1.5,'y',2.5,'label','origin_point');
    % 将 MATLAB 结构体转换为 C 结构体(关键步骤)
    cPoint = libstruct('PointData');
    cPoint.x = point.x;
    cPoint.y = point.y;
    cPoint.label = point.label;
    scale = 2.0; % 缩放因子
    % 调用 DLL 中的 ScalePoint 函数
    calllib('MatlabCppMix','ScalePoint', cPoint, scale);
    % 输出处理后的结构体数据
    disp('===== 结构体缩放结果 =====');
    disp(['原始坐标:(',num2str(point.x),', ',num2str(point.y),')']);
    disp(['缩放后坐标:(',num2str(cPoint.x),', ',num2str(cPoint.y),')']);
    disp(['标签:', cPoint.label]);
catch ME
    warning('结构体处理调用失败:%s', ME.message);
end

%% 5. 卸载 DLL,释放内存
if libisloaded('MatlabCppMix')
    unloadlibrary('MatlabCppMix');
    disp('DLL 已卸载!');
end
3. 关键注意事项(避坑指南)
  1. 数据存储顺序差异:MATLAB 矩阵是列优先存储,C/C++ 是行优先存储。传递二维数组时,需先对 MATLAB 矩阵转置(A'),调用后再转置回原格式。
  2. 内存预分配:MATLAB 中输出数组(如示例中的C)必须提前用zeros初始化,否则会导致内存访问错误。
  3. 结构体类型匹配:使用libstruct函数将 MATLAB 结构体转换为 C 结构体,确保字段名、类型完全一致(如char[20]对应 MATLAB 的字符串)。
  4. 位数一致性:必须确保 DLL 是x64架构,与 MATLAB 的 64 位版本匹配,否则会出现loadlibrary失败。

四、Step 3:内存管理与常见错误排查

1. 内存管理最佳实践
  • 避免重复加载 DLL:使用libisloaded函数判断 DLL 是否已加载,防止内存泄漏。
  • 及时卸载 DLL:脚本运行结束后,调用unloadlibrary释放资源,尤其是长时间运行的程序。
  • C/C++端空指针检查:在导出函数中添加nullptr判断(如示例中的ScalePoint函数),避免 MATLAB 传递空指针导致崩溃。
2. 常见错误及解决方案
错误现象原因分析解决方案
loadlibrary失败,提示'找不到函数'C++ 名称修饰未处理添加extern "C"声明导出函数
调用函数时提示'参数类型不匹配'MATLAB 与 C/C++ 数据类型不一致确保 double 数组、结构体字段类型完全匹配
程序崩溃,提示'内存访问违规'输出数组未预分配或维度不匹配用zeros预分配输出数组,检查矩阵维度参数
DLL 加载失败,提示'不是有效的 Win32 应用程序'DLL 位数与 MATLAB 不匹配编译 x64 架构的 DLL,匹配 64 位 MATLAB

五、扩展内容:loadlibrary vs MEX 文件 适用场景与性能对比

除了 DLL 调用,MATLAB 与 C/C++ 混合编程还有另一种主流方式——MEX 文件。两种方式各有优劣,选择需结合实际需求:

对比维度loadlibrary(DLL 调用)MEX 文件
实现难度低,无需学习 MEX API高,需掌握 MEX 文件编写规范
适用场景已有 C/C++ 代码库,直接封装为 DLL 复用需深度整合 MATLAB,如自定义 MATLAB 函数
性能表现中等,存在函数调用开销高,接近原生 C/C++ 性能,无额外开销
数据交互需手动处理存储顺序、类型转换可直接访问 MATLAB 数组内存,交互更高效
跨平台性差,DLL 仅适用于 Windows好,可编译为 Linux/macOS 的 MEX 文件

选型建议:

  • 若已有成熟的 C/C++ 算法库,优先选择DLL 调用,快速实现复用。
  • 若追求极致性能,或需要在 MATLAB 中直接调用自定义函数,选择MEX 文件。

六、总结

本文通过完整的代码示例,详细讲解了 Windows 环境下 MATLAB 与 C/C++ 混合编程的核心流程:从 C/C++ DLL 的编写、编译,到 MATLAB 中加载 DLL、调用函数、处理数据交互,同时涵盖了内存管理、错误排查和两种混合编程方式的对比。掌握这一技术,你可以轻松结合 MATLAB 的易用性和 C/C++ 的高性能,解决科学计算与工程开发中的复杂问题!

目录

  1. Windows 下 MATLAB 与 C/C++ 混合编程:DLL 生成与调用
  2. 一、核心原理与准备工作
  3. 1. 核心逻辑
  4. 2. 环境准备
  5. 二、Step 1:编写 C/C++ 函数并编译为 DLL
  6. 1. 编写 C/C++ 源码:实现矩阵加法与结构体处理
  7. 头文件 MatlabCppMix.h
  8. 源文件 MatlabCppMix.cpp
  9. 2. 编译生成 DLL(Visual Studio 两种方法)
  10. 方法 1:使用 Visual Studio 图形界面编译(推荐新手)
  11. 方法 2:使用命令行编译(适合开发者)
  12. 三、Step 2:MATLAB 中加载 DLL 并调用函数
  13. 1. 核心函数说明
  14. 2. MATLAB 脚本实现:数据传递与函数调用
  15. 3. 关键注意事项(避坑指南)
  16. 四、Step 3:内存管理与常见错误排查
  17. 1. 内存管理最佳实践
  18. 2. 常见错误及解决方案
  19. 五、扩展内容:loadlibrary vs MEX 文件 适用场景与性能对比
  20. 六、总结

更多推荐文章

查看全部
  • Presenton 故障排除指南:常见问题与解决方案
  • HDFS 常用命令与 Java API 编程实践
  • AI 产品经理核心技能体系与工作流程详解
  • OpenClaw/MaxClaw/KimiClaw/Molili 四大 AI Agent 横向评测
  • Java IO 流进阶:字符流与字节流的核心差异与应用
  • Java 数据类型、运算符与方法核心总结
  • C++ 类与对象进阶:深入理解默认成员函数
  • 单 Agent 与多 Agent 系统架构对比及选型指南
  • 宏智树 AI 学术写作平台评测
  • Linux Shell 脚本中的 for 循环语句详解
  • HTML、CSS、JavaScript 三者关系详解
  • 融合手术导板与增强现实的椎弓根螺钉置入技术验证
  • Win11 原生 PowerShell 运行 Claude Code 接入 Gemini 模型
  • 如何在 Android 上使用 MGit 管理 Git 仓库
  • 5个封神级Claude Skills开源项目,让AI成为你的专属工具管家
  • macOS 平台 AI CLI 工具安装配置指南:OpenClaw、Gemini CLI、Claude Code
  • 智谱清影 2.0:AIGC 视频技术突破与产业价值解析
  • AI赋能原则1解读思考:超级能动性-AI巨变时代重建个人掌控力的关键能力
  • 地瓜机器人 RDK 系列选型指南:X3 vs X5 vs S100 vs S100P
  • AI 与嵌入式方向学习路线

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online