MATLAB MEX文件构建成功但没有显示

时间:2015-07-31 10:09:39

标签: c++ matlab visual-studio-2012 mex

我是新来的,所以我会尝试清楚地揭露我的问题: 我目前正在开发一个MATLAB语言程序,必须加载一个库才能正常工作。但是,后者是用C / C ++编写的(我无法访问它),但我可以用C ++调用它,然后创建一个MEX文件来使用返回值。 使用Visual Studio 2012,我成功地设法调用库(当我将参数值作为参数时,portRead函数返回一个值)。这是我的代码:

// Test704.cpp : Defines the entry point for the console application.
#define _AFXDLL
#define _tprintf mexPrintf
//#include "afx.h"
#include "StdAfx.h"
#include "704IO.h"
#include "Test704.h"
//#include "mat.h"
#include "mex.h"
//mxArray *matGetNextVariable(MATFile *mfp, const char **name);
#ifdef _DEBUG
  #define new DEBUG_NEW
#endif
/////////////////////////////////////////////////////////////////////////////

CWinApp theApp;  // The one and only application object

/////////////////////////////////////////////////////////////////////////////

using namespace std;

/////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, TCHAR *argv[], TCHAR *envp[])
//void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{

//int     nRetCode(0);
HMODULE hModule(::GetModuleHandle(NULL));
short   valueRead;

  if (hModule != NULL)
  {
    // Initialize MFC and print and error on failure
    if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
    {
      //_tprintf(_T("Fatal Error: MFC initialization failed\n"));
      //mexPrintf("Fatal Error: MFC initialization failed");
      //nRetCode = 1;
    }
    else
    {
      while(true)
      {
        valueRead = PortRead(1, 780, -1);
        _tprintf(_T("Value Read = %i\n"), valueRead);
        //mexPrintf("Value Read = %i",valueRead);
        Sleep(1000);  // Sleep for 1s so we can see the value on the screen
      }
    }
  }
  else
  {
    _tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
    //mexPrintf("Fatal Error: GetModuleHandle failed");
   // nRetCode = 1;
  }

  //return nRetCode;
}

/////////////////////////////////////////////////////////////////////////////
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    int _tmain();
    //short   valueRead;
    //valueRead = PortRead(1, 780, -1);
    //_tprintf(_T("Value Read = %i\n"), valueRead);
    //mexPrintf("Value Read = %i",valueRead);
    return;
}

你可以看到我评论了我不成功的研究来解决我的问题...... 此代码在控制台中返回“valueRead = 255”,这意味着程序运行良好。我现在想要的是在MATLAB中检索这个值。您可能还注意到我创建了一个mexFunction;实际上,我在文档中读到必须用C ++创建MATLAB(= mexFunction)的网关。

现在,使用MATLAB R2015a,我创建了以下MEX文件:

function test()    
location = 'C:\Users\admin\Documents\MATLAB\';
mylib = [location '704IO.lib'];
mex( 'Test704.cpp', mylib)

而不是检索“valueRead”,我只是有一条消息指示

>Building with 'Microsoft Visual C++ 2012'. MEX completed successfully

所以,作为总结,我有功能C ++代码,但我无法弄清楚为什么我无法将它链接到MATLAB才能使用它!我一直在寻求解决方案,我认为现在是时候寻求帮助了:)

非常感谢你的帮助! (P.-S。:我是C ++的初学者,很抱歉误解/语法错误)

1 个答案:

答案 0 :(得分:3)

致电

mex( 'Test704.cpp', mylib)

您只能编译 .cpp文件。因此,MATLAB告诉您MEX completed successfully,这意味着编译工作正常。因此,您将在工作目录中看到一个新文件:根据您的操作系统,可能会调用它,例如Test704.mexw64(Windows,64位)或类似名称。每次更改C ++代码中的内容时都需要调用mex,因此重新编译该文件。

这个编译的文件/函数现在可以像普通的MATLAB函数一样使用。要在没有任何其他参数的情况下调用它,只需键入

即可
Test704()

在MATLAB中。这样,mexFunction()就会被执行,那样你的_tmain()就会运行。

注意:你的C ++代码会将例如valueRead = 255写入MATLAB命令窗口,但它创建一个名为valueRead的变量MATLAB。要创建这样的变量,您必须将读取值从_tmain返回到mexFunction,并在那里分配一个MATLAB变量。

修改 mexFunction中有一个错误:你写的是:

int _tmain();

不是函数调用,而是函数声明。您告诉C++您有一个名为_tmain()的函数,但它永远不会被调用。你需要的是一个函数调用,即只有_tmain()没有int。请记住,您需要提供参数int argc, TCHAR *argv[], TCHAR *envp[]。我只是将这些设置为零:

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    _tmain(0,0,0);
    return;
}