【问题标题】:MATLAB MEX-file builds successfully but nothing is displayedMATLAB MEX 文件构建成功,但未显示任何内容
【发布时间】:2015-07-31 10:09:38
【问题描述】:

我是新来的,所以我会尝试清楚地揭露我的问题: 我目前正在用 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++ 的初学者,很抱歉造成误解/语法错误)

【问题讨论】:

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


    【解决方案1】:

    通过调用

    mex( 'Test704.cpp', mylib)
    

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

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

    Test704()
    

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

    注意:您的 C++ 代码会将例如valueRead = 255 写入 MATLAB 命令行窗口,但它不会在 MATLAB 中创建一个名为 valueRead 的变量。要创建这样的变量,您必须将读取的值从 _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;
    }
    

    【讨论】:

    • @ManaV 我在您的mexFunction 中发现了一个错误。查看编辑后的答案 - 我猜现在它应该可以工作了。
    • 是的,谢谢,我记得在某个时候也有关于此的警告消息。所以现在,当我编译'function test()Test704()'时,MATLAB仍然没有显示任何东西,但它很长一段时间都是“忙碌”的......我们离成功不远了:)可能是因为什么你写在你的笔记?
    • 它是否适用于mexPrintf?如果没有,您可以尝试在代码的不同位置添加mexPrintf('Test\n')(例如_tmain() 的开头),以找出程序真正做了什么,执行了什么,没有执行什么。您也可以尝试使用 Visual Studio 进行调试。 Note 不应影响 Matlab 控制台的输出。
    • 是的,我尝试将 mexPrintf() 放在 _tmain() 和 mexFunction() 中,但我总是收到以下错误消息:“Test704.obj : error LNK2019: unresolved external symbol _mexPrintf referenced in函数 _wmain (如果 mexPrintf() 在 _tmain 中)/_mexFunction (如果 mexPrintf() 在 mexFunction 中)"
    • 奇怪。确保在mexPrintf 之前没有_。这行得通吗?
    猜你喜欢
    • 2016-07-03
    • 1970-01-01
    • 2014-12-02
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多