本文最后更新于 2026年7月15日。
可以的。在MATLAB里调用编译好的DLL(动态链接库)是另一种很常见的混合编程方式。它和MEX文件在原理和调用方式上,确实不一样。
📊 MEX文件 vs 普通DLL:核心区别
简单来说,两者的关系是这样的:
- MEX文件本身就是一种特殊的DLL:它是为了在MATLAB中调用而生的,有一个固定的入口函数
mexFunction,调用方式和MATLAB内置函数一样方便。 - 调用普通DLL更像在调用外部程序:你需要通过特定的MATLAB函数,去加载和调用这个独立的DLL文件。
我把它们的核心区别整理成了下表,看起来会更直观:
| 特性 | MEX 文件 | 普通 DLL |
|---|---|---|
| 核心目的 | 在MATLAB中像调用内置函数一样调用C/C++/Fortran代码,提升效率或复用代码 | 被各种程序(包括MATLAB)通用地调用,实现代码共享和模块化 |
| 入口函数 | 固定格式:mexFunction,专门为与MATLAB交互设计 |
可以是任意自定义的导出函数,如 MatrixAdd, ScalePoint |
| 调用方式 | 直接输入文件名即可:[out] = myMEX(in) |
需分步进行:loadlibrary 加载,calllib 调用,unloadlibrary 卸载 |
| 需要什么 | MEX源文件(.c/.cpp)编译成的MEX文件(如 .mexw64) |
普通C/C++代码编译成的 .dll 文件以及配套的 .h 头文件 |
🔧 如何在MATLAB中调用普通DLL
如果你想调用自己或第三方编译好的普通DLL,可以参考以下标准流程:
-
编译DLL:在C/C++代码里,需要用
__declspec(dllexport)和extern "C"等指令声明你想要导出的函数,然后将其编译为64位的.dll文件。 -
MATLAB端调用:这是关键步骤,主要使用以下几个函数:
loadlibrary:将DLL加载到MATLAB的内存空间。这个函数通常需要DLL文件和对应的.h头文件,以便解析函数接口。calllib:加载成功后,用这个函数来调用DLL中指定的函数,并传入参数。unloadlibrary:完成调用后,用这个函数卸载DLL,释放内存。
需要注意:MATLAB的矩阵是按列优先存储的,而C/C++通常是行优先。传递二维数组时,可能需要在调用前后进行转置操作,才能得到正确结果。
📝 如何选择?
所以,选择哪种方式,主要看你的目标和场景:
- 如果你只是想快速在MATLAB里跑一个C语言写好的算法,并且希望它用起来像普通的MATLAB函数一样简单,那么MEX文件是更直接的方式。
- 如果你手里的DLL是一个通用库,或者你希望在MATLAB里能“查看接口”,用工具(如Dependency Walker)看到
MatrixAdd这样的导出函数名,那么通过loadlibrary和calllib来调用普通DLL就完全符合你的需求。这种方式也能让你更清晰地观察到DLL导出了哪些具体函数。