m脚本只能使用mex吗,可不可以编译成dll调用

123 次阅读

本文最后更新于 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,可以参考以下标准流程:

  1. 编译DLL:在C/C++代码里,需要用 __declspec(dllexport)extern "C" 等指令声明你想要导出的函数,然后将其编译为64位的 .dll 文件。

  2. MATLAB端调用:这是关键步骤,主要使用以下几个函数:

    • loadlibrary:将DLL加载到MATLAB的内存空间。这个函数通常需要DLL文件和对应的 .h 头文件,以便解析函数接口。
    • calllib:加载成功后,用这个函数来调用DLL中指定的函数,并传入参数。
    • unloadlibrary:完成调用后,用这个函数卸载DLL,释放内存。

    需要注意:MATLAB的矩阵是按列优先存储的,而C/C++通常是行优先。传递二维数组时,可能需要在调用前后进行转置操作,才能得到正确结果。

📝 如何选择?

所以,选择哪种方式,主要看你的目标和场景:

  • 如果你只是想快速在MATLAB里跑一个C语言写好的算法,并且希望它用起来像普通的MATLAB函数一样简单,那么MEX文件是更直接的方式。
  • 如果你手里的DLL是一个通用库,或者你希望在MATLAB里能“查看接口”,用工具(如Dependency Walker)看到MatrixAdd这样的导出函数名,那么通过 loadlibrarycalllib调用普通DLL就完全符合你的需求。这种方式也能让你更清晰地观察到DLL导出了哪些具体函数。