matlab将.m文件导出dll
根据项目需要,需要这边引用matlab的函数进行数据处理,首先考虑是将matlab代码直接导出成c/c++代码,但是由于matlab代码中引用了其他的matlab库函数,无法直接导成c/c++代码,退而求其次,转而考虑导出为dll文件
1、需要安装matlab和vs,目前分别是2016版本和2022版本
导出步骤可参考https://www.cnblogs.com/jsdy/p/12021348.html。
APP->library compiler
分别选择要打包的形式,打包的.m文件,输入dll名等信息,点击package开始打包。
2、另外由于matlab2016的版本相对于vs2022版本比较低,使用mbuild -setup命令无法找到vs编译器,需要手工引入
具体可参考https://blog.csdn.net/m0_51546637/article/details/126325136,关于低版本的matlab引用高版本的vs的配置方式
3、导入的.m文件在matlab中中文显示乱码,但是之前在其他机器的matlab显示正常,这个是由于本机的matlab配置的编码是gbk导致
可参考https://blog.csdn.net/zhugby/article/details/124514643对matlab的配置文件进行调整以解决此问题。
4、使用qt引用此dll文件,正常导入头文件和库文件后,程序一运行立即崩溃
是由于在.pro文件中引入matlab运行库时,路径配置使用的是windows路径,导致无法正常引用到库和头文件,将目录改成linux形式后,运行正常,如图:
5、另外还出现调用此dll时,程序运行失败,提示matlab库出现严重错误,这个是由于未正确配置matlab运行库的地址导致
在系统环境变量中配置matlab运行库的地址,既可以配置本机安装的matlab的运行库地址,也可以另外安装matlab的运行库
6、修改参数时,程序报错
错误使用 testdll
输出参数太多。
extern LIB_testdll_CPP_API void MW_CALL_CONV testdll(int nargout, mwArray& r1, mwArray& r2, const mwArray& p1);
这个是由于参数int nargout未正常指定,此参数指定了输出参数的个数,不能超过matlab中函数定义的实际的参数个数,否则会报错,若是小于实际参数个数,则按参数给的参数个数进行实际输出,超过此参数个数的其他输出参数无输出。
7、在IDE调试运行时正常,使用工具发布程序后,程序调用dll时崩溃,重新写的其他的简单的dll在生成qt程序后发布后运行,时行时不行,用vs相对稳定一些,同时此程序在使用vs运行时提示报错:C++调用matlab dll报错:Invalid input:Null runtime instance
但是在qt的IDE环境调试模式下却能正常运行,经过网上查找资料,发现是本机matlab缓存导致的vs运行报错以及qt重新发布后无法运行的情况。
上matlab官网论坛未找到答案,后发现该博文(记录一次Matlab环境报错:The MATLAB Runtime instance could not be initialized - 水为痕 - 博客园),虽然是报未初始化的错误,但感觉和我的问题类似,于是按照文中的方法,将C:\Users\Administrator\AppData\Local\Temp\Administrator\mcrCache9.8目录删除后,qt程序发布后运行正常,vs调用运行也正常,猜测是matla的运行库冲突导致。
原文链接:https://blog.csdn.net/guoqiong07/article/details/123000335