Visual Studio 2010
Matlab2014a 64bit
Windows7 64bit
以下是我安装的 Matlab2014a 支持的 C++混合编译器的SDK版本(为了上下版本兼容我选择VS2010)。
一、Matlab 示例代码
function [ a ] = add( x,y )
a = x + y;
end
1.Matlab 先配置外部编译环境 (目的是通过外部编译器编译目标 [dll] 动态链接库)
mbuild -setup 选择VC++ 2010
mex -setup 选择VC++2010
2.使用 deploytool 可视化工具或使用命令mcc -W cpplib:add -T link:lib add将上述算法打包成dll动态链接库:
注明:使用 deploytool (在Matlab命令窗输入deploytool,选Library Compier 然后三步曲)会生成下列文件
注明:使用command(在Matlab命令窗输入 mcc -W cpplib:add -T link:lib add,在你当前的workspace输出结果;关于编译命令的详细说明,可以在命令窗键入: help mcc ,查看 -W 的相关解释)则会生成下列文件(项目只需要使用到上述deploytool讲到的三个lib文件)
二、Visual C++ 调用示例代码:
- 创建VC++项目,编写如下代码用于验证Matlab动态链接库算法是否调用成功。
#include <windows.h>
#include <iostream>
#include "add.h"
using namespace std;
int main(void)
{
int a = 10;
int b = 20;
int out = 0;
if(!addInitialize())
{
cout<<"Couldnot initialize lib:add()!"<<endl;
exit(0);
}
mwArray mwA(1,1,mxINT32_CLASS);
mwArray mwB(1,1,mxINT32_CLASS);
mwArray mwC(1,1,mxINT32_CLASS);
mwA.SetData(&a,1);
mwB.SetData(&b,1);
add(1,mwC,mwA,mwB);
out = mwC.Get(1,1);
cout<<"Ans = "<<out<<endl;
system("pause");
return 0;
}
三、配置Visual C++项目外部依赖项,配置入口
(由于64bit操作系统,VC运行环境也需要配置为x64,若是32位操作系统对应设定即可)
1.选中项目 – 右键 - [属性] - [配置属性] -[ VC++目录]
[包含目录]D:\Program Files\MATLAB\R2014a\extern\include
[库目录] D:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft
2.选中项目 – 右键 - [属性] - [链接器] - [常规]
[附加库目录]D:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft
3.选中项目 – 右键 - [属性] - [链接器] – [输入]
[附加依赖项] 键入如下Lib:libeng.lib、libmat.lib、 libmex.lib、libmx.lib、mclmcrrt.lib、mclmcr.lib、add.lib
四、运行结果
以上例子虽然简单,但是这条路已经通了。对于Matlab这么庞大的算法资源随便做成动态库,为我所用(matla部分算法是不对外开放的)。
以上内容是VC调用Matlab算法库的实现
-------------------------华丽的分割线-----------------------------------华丽的分割线--------------------------
增加部分: Matlab 调用 VC 动态链接库实现
意义 :脚本化控制 VC 实现的接口函数,释放工具开发人员(matlab脚本语言不需要编译)
应用场景 : 嵌入式类研发Debug 、调试、自动化验证平台等
一、VC
1、创建新项目:win32 ->DLL->(导出符号、空项目)
2、创建(功能实现接口)API文件:
创建以下三个文件及相应内容,并实现 mexFunction 函数。
注意:
1、这里创建的VC文件,将来就是Matlab的函数名,建议命名文件时以函数方式命名,这是matlab接口协议规定的:每个接口函数以文件名形式存在,所有文件里面创建同一个函数名 mexFunction 包括参数(这个 Function 类似 C 的 main 函数)。
2、vc_add.cpp、vc_add.h、vc_add.def 其中 vc_add.cpp 的 mexFunction 函数我有几句话补充一下 : nlhs、plhs[],是返回值参数,nrhs、prhs[] 是函数的形参,mxCreateDoubleMatrix 类似 C 的 malloc ,目的是为了给返回值创建一个1x1的矩阵,如果返回值是多个,那你就得按照实际情况创建, 它是 mxArray 数据类型。
【vc_add.cpp】
#include <iostream>
#include <string>
#include "vc_add.h"
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *a;
double b, c;
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
a = mxGetPr(plhs[0]);
b = *(mxGetPr(prhs[0]));
c = *(mxGetPr(prhs[1]));
*a = b + c;
}
【vc_add.h】
#include "matrix.h"
#include "mex.h"
#define MEX_FUNCTION_API __declspec(dllexport)
MEX_FUNCTION_API void mexFunction(int nlhs, mxArray* plhs[], int nrhs, mxArray* prhs[]);
【vc_add.def】
LIBRARY
EXPORTS
mexFunction
3、以下关于VC IDE的相关配置:
(我比较懒,就全部上截图了,从上到下依次配置)
![](https://i-blog.csdnimg.cn/blog_migrate/1414f59358086be3b3818d644bdfe39f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6d47e57dccfde1c60a32f47f74eef18c.png)
4、生成解决方案
build完生成如下四个档案,我们只需要用到vc_add.mexw64
5、将vc_add.mexw64 copy 到 Matlab Workspace(里面有我另外一个函数,以后每增加一个函数就必须以文件的形式增加进来)
这个时候Matlab 可以将刚刚实现的API 接口当內建函数直接使用了。
-------------------------华丽的分割线-----------------------------------华丽的分割线--------------------------
增加部分: VC++与Matlab引擎实现混编
应用场景 : Win32/Win64直接使用Matlab的强大数学建模或绘图
一、环境配置
1、Matlab workspace的设置,(若不设置)默认路径在Matlab的安装目录
二、1、Matlab引擎外部调用需在系统环境变量 Path 增加
D:\Program Files\MATLAB\R2014a\bin\win64 (否则有可能提示缺失某些Matlab dll)
三、Visual studio C++编译环境配置
![](https://i-blog.csdnimg.cn/blog_migrate/fd36cffa8acbfd214e85233193750836.png)
四、代码实现-(示例)
Matlab:(自定义加法程序) 实现之后将Mat函数文件保存在你设定的Workspace根目录
function [ r ] = m_add( a,b )
r = a + b;
end
Visual C++:
#include "stdafx.h"
#include <windows.h>
#include "engine.h" //包含引擎
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
Engine *ep;
int nStatus = 0;
mxArray *result = mxCreateDoubleMatrix(1,1,mxREAL); // malloc memery
double arResData[1][1];
if(!(ep = engOpen(NULL)))
{
cout<<"Can't start Matlab Engine"<<endl;
exit(1);
}
nStatus = engSetVisible(ep, false); // 隐藏matlab引擎启动的win com窗口
nStatus = engEvalString(ep, "result = m_add(1, 8)");//通过matlab引擎计算1+8的和
result = engGetVariable(ep,"result");// 获取Matlab引擎执行的返回值
memcpy((void*)arResData,(void*)mxGetPr(result),sizeof(arResData));//返回值转存
mxDestroyArray(result); // Destroy mxArray
cout<<"sum is "<<arResData[0][0]<<endl;
engClose(ep); // free ep
system("pause");
return 0;
}
五、运行结果
附1: Matlab 官方为不同编程语言提供的API接口列表
MATLAB API for Other Languages
附2:不同的Matlab版本对操作系统的支持要求及混合编译器版本要求
Support - System Requirements and Supported Compilers Previous Releases - MATLAB & Simulink
附3 : 目标终端机器上运行混编的可执行程序需要有MCR环境,官方对应不同版本有不同的MCR
MATLAB Runtime - MATLAB Compiler - MATLAB
附4: download
链接:http://pan.baidu.com/s/1skWNe9J 密码:h3ao