回 帖 发 新 帖 刷新版面

主题:[Linker Error] 用C++Builder调用Matlab的实例运行时出现这样的错误!

下面是我用C++Builder调用Matlab的实例运行时出现这样的错误!
"[Linker Error] Unresolved external '_mclGetPr' referenced from C:\DOCUMENTS AND SETTINGS\JOHN\桌面\调用MATLAB\UNIT1.OBJ"

"[Linker Error] Unresolved external '_mclCreateDoubleMatrix' referenced from C:\DOCUMENTS AND SETTINGS\JOHN\桌面\调用MATLAB\UNIT1.OBJ"
而后面运行时有有这样的错误
"Access violation at address CAFEDEAD.Read of address CAFEDEAD."
请问哪位高手可以帮我一下呢?

Unit1.cpp
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "engine.h"
#include "mat.h"
#include "matlab.h"
#include "matrix.h"
#include "tmwtypes.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TEdit *Edi[2];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
  float *b,a[4]={2,5,4,3};
  float c[2];
  mxArray *z,*x,*y;
  Engine *ep;
   z=mxCreateDoubleMatrix(2,2,mxREAL);
   mxSetClassName(z,"z");
   if(ep=engOpen(NULL))
   {
    memcpy((char*)mxGetPr(z),(char*)a,4*sizeof(float));
   engEvalString(ep,"[x,y]=eig(z);");
   memcpy((char*)c,(char*)mxGetPr(x),2*sizeof(float));
   }
   else ShowMessage("Can't Open The Engine!");
   engClose(ep);
   for(int i=0;i<2;i++)
   {
   Edi[i]=new TEdit(this);
   Edi[i]->Text=FloatToStr(c[i]);
   Edi[i]->Parent=Form1;
   Edi[i]->Visible=true;
   Edi[i]->Left=40;
   Edi[i]->Top=50+i*40;
   Edi[i]->Height=21;
   Edi[i]->Show();
   }


}
//---------------------------------------------------------------------------
[size=5]Access violation at address CAFEDEAD.Read of address CAFEDEAD[/size]

回复列表 (共2个回复)

沙发

1.首先使用eig(z)时,z必须是一个方阵,所以,即使你的源码中没有其他错误,在matlab 命令窗口中也不会得到正确结果。
2.在bcb中调用matlab 必须加入某些库文件。具体如下:
 在matlab\\extern\\include目录下找到_libeng.def  _libmat.def  _libmx.def 找到这三个文件。将其拷贝到C:\Documents and Settings\Administrator .点击 开始-》运行 输入cmd 调出控制台
用implib 将上述三个def 文件转化为三个lib库文件
implib libeng.lib _libeng.def  
implib libmat.lib _libmat.def
implib libmx.lib  _libmx.def
在C:\Documents and Settings\Administrator 输出libeng.lib  libmat.lib  libmx.lib  

创建一个bcb 工程
选择Project\Add to Project 从下拉框中选择lib 文件,将上面三个lib文件加入工程
选择Project\Options\Directories Condionals
点击Include Path 右边的带三个点的小按钮,再点击Greyed denote items invalid path 右边的带三个点的小按钮。选择matlab\extern\include 文件夹。点击Greyed denote items invalid path 下面的Add按钮。点击OK
同上在Library Path 选项添加matlab\extern\lib文件夹
3.在Unit1.cpp上部写上#include"Engine.h"
至此大功告成。

#include <vcl.h>
#include"Engine.h"
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TEdit *Edi[8];

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
double *b,a[2][4]={{2,5,4,3},{3,4,5,6}};
 double *c;
  mxArray *z,*x1=NULL;
  Engine *ep;
   z=mxCreateDoubleMatrix(2,4,mxREAL);
   //mxSetClassName(z,"z");
   if(ep=engOpen(NULL))
   {
    memcpy((char*)mxGetPr(z),(char*)a,2*4*sizeof(double));
   engPutVariable(ep,"z",z);
   engEvalString(ep,"x=z;");
    x1=engGetVariable(ep,"x");//获得mxArray类型的变量
    c=mxGetPr(x1);//获得指向x1中各个元素的指针。由于数组名即是数组元素的首地址,即指向数组
   }//中各个元素的指针。所以下面就可以引用c[i]了。
   else ShowMessage("Can't Open The Engine!");
   engClose(ep);
   for(int i=0;i<8;i++)
   {
   Edi[i]=new TEdit(this);
   Edi[i]->Text=c[i];
   Edi[i]->Parent=Form1;
   Edi[i]->Visible=true;
   Edi[i]->Left=40;
   Edi[i]->Top=50+i*40;
   Edi[i]->Height=21;
   Edi[i]->Show();
   }



}
//---------------------------------------------------------------------------

板凳

这个问题我以前也接触过,开始的时候我也找不到问题的原因,后来我进了一个技术交流群,这个群里的人挺多的,在里面可以沟通技术,你可以进去看一下.群号是:四三四八零零七一。另外,这个群里可以接项目。

我来回复

您尚未登录,请登录后再回复。点此登录或注册