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',default易做图);
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 ,