MATLAB具有很高的计算性能,在该平台上很多算法易于实现,而有时需要使用C++调用Matlab编写的程序,可以将该函数编译成dll库文件,之后在C++中对其进行调用。

本文详细讲解在Matlab中将函数编译成库文件,并在C++中进行调用的方法。

Matlab编译

首先,matlab中写好函数

matlab在 .NET 全局程序集缓存(GAC)中找不到

第一步:在matlab的命令行窗口中输入mex -setup,会出现以下界面。

matlab在 .NET 全局程序集缓存(GAC)中找不到

 第二步:点击界面的“mex -setup C++”,会出现如下提示。

matlab在 .NET 全局程序集缓存(GAC)中找不到

 以上两步说明Matlab的编译环境可行,并且是使用VS2015进行编译。不同版本的matlab使用的编译器可能不同,请确保matlab配置的编译器与之后使用的C++环境保持一致。

第三步:对matlab的函数进行编译。注意:这里只能对matlab的function进行编译,并不能对一般的.m脚本进行编译。我们采用mcc的方式进行编译,命令如下:

mcc -W cpplib:testmat -T link:lib testmat.m -C

解释:
-W是控制编译之后的封装格式;
cpplib是指编译成C++的lib,如果需要编译成C的lib,就用lib即可,去掉cpp;
cpplib后面的是需要生成文件的文件名,是自己取的,我们取名为testmat;
-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字即是.m函数的名字。
其他具体含义可以通过mcc –help命令查看,注意参数的大小写。

第五步:等待matlab进行编译,这个过程可能需要几分钟。编译完成后的命令行显示如下信息:

matlab在 .NET 全局程序集缓存(GAC)中找不到

 需要用到的文件只有四个:testmat.ctf,testmat.dll,testmat.lib,testmat.h。

 

PS:使用上述方法时,我第一次成功了,后边同样的操作一直失败,报错如下图:

matlab在 .NET 全局程序集缓存(GAC)中找不到

查了很久也没有找到原因,在Matlab Answers里看到一个问答,

matlab在 .NET 全局程序集缓存(GAC)中找不到

 有个回答如下:

matlab在 .NET 全局程序集缓存(GAC)中找不到

大概意思就是把主编译文件.m放在matlab主程序文件夹内(我试了不行..),或者使用deploytool,这个工具可以生成特定文件夹内.m文件dll等库的功能。

 

于是乎,使用deploytool生成头文件以及库文件等,成功,deploytool方法如下:

第一步:在命令行窗口输入mbuild -setup(注意-之前加空格,否则报错)

matlab在 .NET 全局程序集缓存(GAC)中找不到

 第二步:点击mex -setup C++ -client MBUILD后,继续输入deploytool

matlab在 .NET 全局程序集缓存(GAC)中找不到

 等待弹出窗口,如下图,选择Library Compiler

matlab在 .NET 全局程序集缓存(GAC)中找不到

弹出窗口,一定要选择C++ Shared Library,选其他的生成的不对,然后点击右侧加号,选择.m文件,

matlab在 .NET 全局程序集缓存(GAC)中找不到

matlab在 .NET 全局程序集缓存(GAC)中找不到

窗口下边会出现即将生成的文件

matlab在 .NET 全局程序集缓存(GAC)中找不到

 点击右上角生成按钮,选择生成文件放置文件夹,等待打包完成。

 

matlab在 .NET 全局程序集缓存(GAC)中找不到

matlab在 .NET 全局程序集缓存(GAC)中找不到

 最后生成是文件在对应文件夹中,.ctf文件在v2文件夹里,自己找找,到这里matlab生成库文件就完成了

matlab在 .NET 全局程序集缓存(GAC)中找不到