- 做毕设时,一些复杂的dsp算法考虑用matlab实现,封装成库给qt调用。在搭建的过程中遇到了一些问题,在此记录。
- 环境Matlab2018b + Qt 5.14 mingw64 7.3
1.用matlab封装.m,产生库文件
matlab中的函数有两种,非内置和内置(build-in)。build-in的我们无法看到源码,我选择用一个build-in函数floor进行测试。
myFunc.m的内容如下图
-
安装matlab环境下的mingw编译器。
-
配置matlab环境中的编译器
-
编译myFunc.m文件产生库文件
将matlab的当前工作目录选择为myFunc.m所在目录,执行mcc -W clib:myLib -T link:lib myFunc
myLib为编译成的库文件名,myFunc为指定的.m文件名,不要加后缀。 -
编译成功后,产生文件如下
myLib.h是库的头文件,对库中函数进行声明,myLib.lib是静态库文件,myLib.dll是动态库文件,我们会用到这三个文件。myLib.cpp是将myFunc.m的代码编译成的cpp文件,该文件不能直接使用,还需要和库链接,我们在此用不到它。
2.建立Qt工程,导入库文件并执行
- qt调用动态库(共享库)文件有两种方式,隐式链接和显式链接,这两种方式的具体差别在此不详述,请参看有关qt书籍。
- 显式链接需要用QLibrary解析dll函数,比较麻烦。因为我们同时有lib和dll文件,我们在这里使用比较简单的隐式链接方式。隐式链接我们需要添加lib文件,编译时会使用lib中的动态库的导出定义,获知dll中有哪些接口类和函数。
-
在qt工程下建立include和lib文件夹,将myLib.h和myLib.lib,myLib.dll文件分别放入
-
加入各种库的目录
- 在main函数中,包含myLib.h文件,注意要先初始化库对象。mxArray类用于matlab和C++之间的数据类型转换,具体代码含义在此不再详解,请参见C++调用matlab引擎编程中关于mxArray的博客(c++调用matlab引擎编程),或者matlab帮助页。
- 注意在运行时,要将dll库自行放置于可执行文件的同一目录下,否则会出错。
- 我们看到输出 floor(333.23) = 333 ,qt正确调用了matlab build-in库函数的封装。