当前位置:编程学习 > Matlab >>

matlab 7与vc/mfc混合编程 脱离运行环境,移植代码

一、问题提示
 
7.0/7.1版本有个问题:
 
Warning: No matching builtin function available for C:\MATLAB7\install\toolbox\simulink\simulink\set_param.bi
 
或者mcc变成m文件成可执行文件exe后,运行会出现:
 
Undefined command/function 'set_param'
Error in ==> matlabrc at 81
 
解决方法:
1、将\MATLAB7\toolbox\compiler\deploy\matlabrc.m 中的
81行  set_param(0,'PaperType',defaultpaper);
82行  set_param(0,'PaperUnits',defaultunits);
注释掉,或者干脆删掉。
2、在Matlab7 的命令窗口运行rehash toolboxcache
3、重新编译文件后即可运行。
二、脱离环境:
 
将MATLAB7\install\toolbox\compiler\deploy\win32\MCRInstaller.exe
 
拷贝到没有安装matlab的机器上,运行安装,就可以脱离matlab环境运行了。
 
三、混合编程:
 
最好将vc编译的exe的生成目录直接生成到matlab的m文件生成的dll目录下面。
 
一个方便动态调用matlab生成的dll,二个方便直接调试执行。
 
1. matlab命令行中:mcc -W lib:abcdef_dll -T link:lib abcdef.m
 
注意,这个命令要求当前目录(matlab窗口上方可以切换工作目录)存在abcdef.m;另外这个动态链接库的名字加上_dll是为了不跟matlab的命令冲突,不然,你直接在matlab中输入abcdef,想执行m函数(自己些的代码),结果他会先找dll,报错的。
 
2.vc中在工具->选项,中的include跟lib目录中加上(以下以6.0为例,假设要转换abcdef.m):
 
inlucde中加上:
 
C:\MATLAB7\install\work
 
C:\MATLAB7\install\extern\include
 
lib中加上:
 
C:\MATLAB7\install\extern\lib\win32\microsoft\msvc60
 
C:\MATLAB7\install\work
 
所以这儿强烈简易自己要编译成dll的m文件就放在
 
C:\MATLAB7\install\work中,不然matlab编译的h/lib文件,还得手工添加进来。
 
3.vc中调用(红色的是跟dll名称有关的):
 
#include "abcdef_dll.h"
#include "mclmcr.h"
#pragma comment (lib,"abcdef_dll.lib")
#pragma comment (lib,"mclmcrrt.lib")
#pragma comment (lib,"mclmcr.lib")
 
在初始化代码中:
 
 if (!mclInitializeApplication(NULL,0))    
 {AfxMessageBox("不能初始化程序!");return 0;}
 bool result=print2_dllInitialize();  //初始化
 
 if(result==FALSE)
 
 {  
  int i=GetLastError();
    MessageBox("初始化失败,请重新点击该按键!",LPCTSTR(L"提示信息:"),MB_OK|MB_ICONINFORMATION);
 
 }
 
调用代码:
 
 mxArray* y=NULL; 
 mxArray* z=NULL; 
 double power[12]={3.0,4,3,4,5,6,7,8,9,10,11,12};
 mxArray *P_matlab = mxCreateDoubleMatrix(1,12,mxREAL);
 double* data =mxGetPr(P_matlab);
 //memcpy(mxGetPr(P_matlab),power,sizeof(double)*sizeof(power));
 for (int i = 0; i < 12; i++)
 {
  data[i]=power[i];
 }
 char szTmp[1024];
     sprintf(szTmp,"传递字符");
  mxArray* m = mxCreateString(szTmp);
 mlfabcdef(1,&y,P_matlab,m); ///传递了一个数组,一个字符串
 
mxDestroyArray(P_matlab);
 
 
 
退出或者失构函数:
 
 abcdef_dllTerminate();
 mclTerminateApplication();
 
四、软件发布
 
1.MCRInstaller.exe做安装包的时候一起打包,并自动执行
 
2.拷贝matlab编译好的dll/ctf两个文件就可以(其他.h/lib/c文件,是编译的时候用的,不用发布)。
 
 
 
补充:软件开发 , Vc ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,