VS2015联合matlab2016b生成mexw64文件

2019-08-31 18:32

Vs2015联合matlab2016b生成.mexw64文件2017.12

最近要用C-mex文件,搜索了好几天在网上没有发现有用的资料,要么资料太旧,使用不了,最终在matlab帮助文档和国外的网站论坛上求助最终后成功。在此要特别强调,遇到问题的第一件事是去查帮助文档,而不是search。耐下心去看英文文档,真正高深的有用的基本上在帮助文档里面都有解释。实在解决不了的去论坛上提问,高手还是很多的。

最后程序也可以在Codeblocks上运行生成,感谢外国友人的帮助,有时间的话会写一篇关于Codeblocks上运行生成mexw64文件的文章。有想知道了解的可以私信我。

一、Matlab和IDE混合编程的方法有以下几种:

1、 matlab调用由IDE编译出来的mex文件(相当于动态链接文件,这一点相当重要,不要

使用生成控制台程序,这一点一错,后面都不用看了),老版本的mex文件后缀是.dll,新版本的mex文件后缀是.mexw32/64(根据版本生成)。 2、 IDE通过engine调用matlab文件。

以上两种方法matlab帮助文档写的都包括,这种只详细讲第一种方法。 二、使用的平台是matlab2016b 64位和VS2015社区版。(把下面所述的项目,C文件名称全

部改为arrayProduct)

1、 新建一个项目,选择win32/win32项目(可用于创建DLL和静态库项目),不是选择

的win32控制台应用程度。

下面输入位置名称等,下一步选择程度类型为DLL,设置一个空项目

2、 然后生成解决方案如图所示

在源文件里面添加一个C文件,或者已有的C文件。因为matlab是64位,所以调试工具也要选择X64

3、 在源文件里面新建一个模块定义文件.def,文件的名称与项目,C文件名称一致。

添加内容如下

4、 设置项目属性:

1、 平台是X64,在配置属性里面的目标扩展名更改为:.mexw64 2、 在C/C++常规项里的附加包含目录是设定:

C:\\Program Files\\MATLAB\\R2016b\\extern\\include

这个里面包含的应该是VS所需要调用的matlab的头文件。 3、在C/C++预处理器定义里面加入: MATLAB_MEX_FILE

不知道起什么作用,帮助文档里面这样要求的,网上搜索的都没这项。 4、在链接器/常规里面输出文件定义为: ap.mexw64

文件名为项目名/C文件名,所有名称保持一致 5、在链接器/常规/附加库目录时定义;

C:\\Program Files\\MATLAB\\R2016b\\extern\\lib\\win64\\microsoft 这里应该是链接器寻找动态文件(第6项)的目录。 6、在链接器/输入里面定义: libmx.lib;libmex.lib;libmat.lib;

这是按照matlab帮助文件写的,中间要加;网上搜索的有的要加入libeng.lib, 还有的说中间不能加;只能回车。

7、因为之前添加的模块定义文件,所以在链接器/输入里面的模块定义文件里面自

动生成了ap.def。如果是添加的,此外应该定义添加的文件名。

这里应该是VS链接文件时所要用到的动态文件

这样在VS里面的设置就完成了,点击生成文件,成功后在ap/ap文件夹里面可以找到生成的ap.mexw64文件,然后把这个文件copy到MATLAB的目前目录下(不能新建文件夹),这样就可以在matlab工作窗口时行调试了。

附上C源代码:

/*========================================================== * arrayProduct.c - example in MATLAB External Interfaces *

* Multiplies an input scalar (multiplier) * times a 1xN matrix (inMatrix) * and outputs a 1xN matrix (outMatrix) *

* The calling syntax is: * * *

* This is a MEX-file for MATLAB.

* Copyright 2007-2012 The MathWorks, Inc. *

*========================================================*/

#include\

/* The computational routine */

voidarrayProduct(doublex, double *y, double *z, mwSizen) { mwSizei;

/* multiply each element y by x */ for (i=0; i

/* The gateway function */

voidmexFunction( intnlhs, mxArray *plhs[], intnrhs, constmxArray *prhs[]) {

double multiplier; /* input scalar */ double *inMatrix; /* 1xN input matrix */ size_tncols; /* size of matrix */ double *outMatrix; /* output matrix */

/* check for proper number of arguments */

outMatrix = arrayProduct(multiplier, inMatrix)

if(nrhs!=2) {

mexErrMsgIdAndTxt(\,\); }

if(nlhs!=1) {

mexErrMsgIdAndTxt(\,\); }

/* make sure the first input argument is scalar */ if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) ||

mxGetNumberOfElements(prhs[0])!=1 ) {

mexErrMsgIdAndTxt(\,\scalar.\); }

/* make sure the second input argument is type double */ if( !mxIsDouble(prhs[1]) || mxIsComplex(prhs[1])) {

mexErrMsgIdAndTxt(\,\double.\); }

/* check that number of rows in second input argument is 1 */ if(mxGetM(prhs[1])!=1) {

mexErrMsgIdAndTxt(\,\); }

/* get the value of the scalar input */ multiplier = mxGetScalar(prhs[0]);

/* create a pointer to the real data in the input matrix */ inMatrix = mxGetPr(prhs[1]);

/* get dimensions of the input matrix */ ncols = mxGetN(prhs[1]);

/* create the output matrix */

plhs[0] = mxCreateDoubleMatrix(1,(mwSize)ncols,mxREAL);

/* get a pointer to the real data in the output matrix */ outMatrix = mxGetPr(plhs[0]);

/* call the computational routine */

arrayProduct(multiplier,inMatrix,outMatrix,(mwSize)ncols); }

C代码的目的是计算一个标量和一个向量的乘积。

调用格式为:矩阵=arrayProduct(标量,1*n的矩阵)

附上matlab帮助文档:


VS2015联合matlab2016b生成mexw64文件.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:民族团结进步创建示范单位活动实施方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: