前言(废话,可略过):由于工作需要,使用matlab和vs进行混合编程,win10已安装matlab7.0和vs2008,由于matlab7.0不识别vs2008,额外安装了vc++6.0,进入正题。。
平台:
win10、matlab7.0、vc++6.0
操作步骤:
1、设置matlab编译器,选择vc++6.0
2、命令m文件生成dll文件
3、vc++6.0环境设置
4、编程调用dll文件
实现:
1、设置matlab编译器,选择vc++6.0
matlab输入命令:mex -setup、mbuild -setup,均选择vc++6.0编译器(当然了,高版本matlab也可以选择显示出的vs20xx版本)
2、命令m文件生成dll文件
matlab输入命令:edit,弹出文本编辑框,输入代码:function c = MyAdd(a, b); c = a + b; end 注意换行,end可要可不要。
ctrl + s默认保存在matlab的work目录下。
输入命令:mcc -W cpplib:libMyAdd -T link:lib MyAdd
包含MyAdd.m文件的work目录下,生成如下几个文件:
libmyadd.cpp
libMyAdd.ctf
libMyAdd.dll
libMyAdd.exp
libmyadd.exports
libmyadd.h
libMyAdd.lib
libmyadd_mcc_component_data.c
3、vc++6.0环境设置
新建空控制台程序
添加include和lib库所在目录,tool->option->directory,选择include files,添入C:\MATLAB7\extern\include、C:\MATLAB7\work,具体目录根据安装选择,选择library files,添入C:\MATLAB7\extern\lib\win32\microsoft、C:\MATLAB7\work,因为出现找不到相应lib文件的情况,所以我又添加了C:\MATLAB7\extern\lib\win32\microsoft\msvc60这个文件夹;然后添加lib文件,project setting->link->object/library modules,末尾添加 libMyAdd.lib mclmcrrt.lib libmx.lib libmat.lib mclmcr.lib;最后将 libMyAdd.ctf和libMyAdd.dll两个文件复制到新建的控制台工程的debug目录下。
4、编程调用dll文件
dll文件名为动态链接库,此时进入vc++6.0环境下进行编程。
新建cpp文件,添加以下代码,保存、编译、运行
/*********************************************代码区*************************************************/
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
#include "libMyAdd.h"
#include <stdio.h>
#include <iostream.h>
int main(void)
{
double a = 6;
double b = 9;
double c;
// initialize lib,这里必须做初始化!
if( !libMyAddInitialize())
{
std::cout << "Could not initialize libMyAdd!" << std::endl;
return -1;
}
// 为变量分配内存空间,可以查帮助mwArray
mwArray mwA(1, 1, mxDOUBLE_CLASS); // 1,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,为了和Cpp变量接轨,设置成1*1的矩阵,mxDOUBLE_CLASS表示变量的精度)
mwArray mwB(1, 1, mxDOUBLE_CLASS);
mwArray mwC(1, 1, mxDOUBLE_CLASS);
// set data,不用我解释了吧,很简单的,调用类里面的SetData函数给类赋值
mwA.SetData(&a, 1);
mwB.SetData(&b, 1);
// using my add,掉我自己写的函数
myadd(1, mwC, mwA, mwB);
// get data,不用我解释了吧,很简单的,调用类里面的Get函数获取取函数返回值
c = mwC.Get(1, 1);
printf("c is %f\n", c);
// 后面是一些终止调用的程序
// terminate the lib
libMyAddTerminate();
// terminate MCR
mclTerminateApplication();
return 0;
}
/********************************************代码区**************************************************/
至此,dos窗口出现运行结果:c is 15.000000,a和b代码中分别设为了9和6,则表示成功。
其它参考链接(已测可用):https://zhidao.baidu.com/question/746779163550503052.html
http://www.cnblogs.com/lidabo/p/3501270.html#commentform