读书人

Matlab 7.0 与VC++6.0 联合编程Releas

发布时间: 2012-01-31 21:28:41 作者: rapoo

Matlab 7.0 与VC++6.0 联合编程Release编译错误求助—ebug编译正常)
我的开发环境是:Matlab 7.0 和 VC++6.0(mbuild环境已配置好)
编程步骤:
1、在Matlab中编写一个Draw.m文件,文件内容为:
%实现输入x1与x2,然后绘制sin曲线,然后生成两个随机数并输出
function [X1,Y1]=Draw(x1,x2)
x=x1:0.1:x2;
y=sin(x);
X1=rand(1);
Y1=rand(1);
plot(x,y,X1,Y1,'*');
2、利用命令 mcc -W cpplib:Draw -T link:lib Draw.m 生成DLL;
3、新建一个VC++工程(基于对话框的)
4、拷贝draw.h、Draw.dll、Draw.lib及Draw.ctf到VC++工程目录中,并将Draw.h 加入到当前工程中;
5、设置环境:Project->Setting->Link->Category :Input->Object/library modules:mclmcr.lib Draw.lib;
6、在对话框的头文件中加入 #include "draw.h" 与 #include "mclmcr.h";
7、在对话框的OnInitDialog()事件中进行 MATLAB 库文件的初始化,在对话框的OnDestroy()事件中进行 MATLAB 库文件资源的释放,代码如下:
BOOL CMatlabDrawInputXYDlg::OnInitDialog()
{
CDialog::OnInitDialog();
……………
// TODO: Add extra initialization here
/* Call the mclInitializeApplication routine. Make sure that the application
* was initialized properly by checking the return status. This initialization
* has to be done before calling any MATLAB API's or MATLAB Compiler generated
* shared library functions. */
if( !mclInitializeApplication(NULL,0) )
{
AfxMessageBox( "Could not initialize the application.");
exit(1);
}
/* Call the library intialization routine and make sure that the
* library was initialized properly. */
if (!DrawInitialize())
{
AfxMessageBox("Could not initialize the library.");
exit(1);
}
return TRUE; // return TRUE unless you set the focus to a control
}

void CMatlabDrawInputXYDlg::OnDestroy()
{
CDialog::OnDestroy();
/* Call the library termination routine */
DrawTerminate();
mclTerminateApplication();
}
8、在窗体界面上放置两个编辑框(用于输入起始值和终止值,并设置变量m_X1和m_X2,均为double类型)和一个按钮;
9、编辑按钮单击事件代码,如下:
void CMatlabDrawInputXYDlg::OnBUTTONDraw()
{
// TODO: Add your control notification handler code here
double Data_X1[1],Data_X2[1];
double Data_Out1[1],Data_Out2[1];
CString strPromt;

mwArray m_InX1(1,1,mxDOUBLE_CLASS);
mwArray m_InX2(1,1,mxDOUBLE_CLASS);
mwArray m_OutX1(1,1,mxDOUBLE_CLASS);
mwArray m_OutX2(1,1,mxDOUBLE_CLASS);

UpdateData(TRUE);

Data_X1[0]=m_X1;
Data_X2[0]=m_X2;

m_InX1.SetData(Data_X1,1);
m_InX2.SetData(Data_X2,1);

draw(2,m_OutX1,m_OutX2,m_InX1,m_InX2);
//extern void mlxDraw(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);
//extern void draw(int nargout, mwArray& X1, mwArray& Y1, const mwArray& x1, const mwArray& x2);

m_OutX1.GetData(Data_Out1,1);
m_OutX2.GetData(Data_Out2,1);

strPromt.Format("X1= %.6f",Data_Out1[0]);
AfxMessageBox(strPromt);
strPromt.Format("Y1= %.6f",Data_Out2[0]);
AfxMessageBox(strPromt);
}
10、编译通过,运行正常
11、改成Release编译,出现11处错误,如下:
MatlabDrawInputXYDlg.obj : error LNK2001: unresolved external symbol _mclcppCreateError
MatlabDrawInputXYDlg.obj : error LNK2001: unresolved external symbol _mclcppFeval
MatlabDrawInputXYDlg.obj : error LNK2001: unresolved external symbol _mclcppGetLastError
MatlabDrawInputXYDlg.obj : error LNK2001: unresolved external symbol _mclcppGetArrayBuffer
MatlabDrawInputXYDlg.obj : error LNK2001: unresolved external symbol _DrawInitialize
MatlabDrawInputXYDlg.obj : error LNK2001: unresolved external symbol _mclInitializeApplication
MatlabDrawInputXYDlg.obj : error LNK2001: unresolved external symbol "void __cdecl draw(int,class mwArray &,class mwArray &,class mwArray const &,class mwArray const &)" (?draw@@YAXHAAVmwArray@@0ABV1@1@Z)


MatlabDrawInputXYDlg.obj : error LNK2001: unresolved external symbol _mclGetMatrix
MatlabDrawInputXYDlg.obj : error LNK2001: unresolved external symbol _mclTerminateApplication
MatlabDrawInputXYDlg.obj : error LNK2001: unresolved external symbol _DrawTerminate
Release/MatlabDrawInputXY.exe : fatal error LNK1120: 10 unresolved externals
Error executing link.exe.

[解决办法]
检查release和debug的设置中link页中的设置有何不同
[解决办法]
你只在Debug下面做设置了吧,把同样的设置在Release下面也做一遍。特别是那几个lib文件
[解决办法]
在release模式下也要连接相应的lib库,debug模式下的设置对release不起作用...
[解决办法]
是为什么编译的时候不会把Draw.dll自动加载到Release目录下去呢?
-------------------------
你是说release目录下看不到Draw.dll这个文件?这个需要你自己拷贝进去
[解决办法]
你可以在build Event,Post Event里面,给copy过去,
xcopy /D /Y "$(SolutionDir)"..\Externals\imf\bin\IMFd.dll "$(TargetDir)"
这些宏在Debug和Release下对应不同的目录。
[解决办法]
1)还有一个办法,就是release和debug都输出到一个目录,然后在哪个目录中使用*.dll.
2)或者, 干脆就把这个文件直接注册到system32中,然后再使用吧
3)可以设置环境变量,指向dll文件所在的目录
就是说可以按照操作系统查找dll的顺序中的任意一个设置。

读书人网 >VC/MFC

热点推荐