从Matlab和MEX文件

时间:2016-05-23 11:23:51

标签: c++ matlab dll mex

我一直试图使用Matlab R2016a与设备交换数据但没有成功。我试过两个正在运行的开发人员和#39; Matlab示例和此:

loadlibrary('myDevice.dll','myDevice.h')

但两者都会导致同样的错误:

Error using loadlibrary
Failed to preprocess the input file.
Output from preprocessor is: myDevice.h
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\xtgmath.h(214) : warning C4602: #pragma pop_macro : 'new' no previous #pragma push_macro for this identifier
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\eh.h(27) : fatal error C1189: #error :  "eh.h is only for C++!"

通过查看此论坛中的其他主题(例如here),我的理解是某些C ++资源正在其他C代码中使用。不幸的是,我不知道C或C ++是什么,所以我无法确认这一点(更不用说修复它了。)
所以,第一个问题是:设备开发人员在编写相关代码时是否犯了一些愚蠢的错误(实际上C和C ++代码存在不匹配),或者我错过了一些非常明显的错误,在这里?

另一个主题建议将所有内容包装在MEX文件中。因此,我从Visual Studio 2013中的设备开发人员处运行了一个C ++示例,以确保此示例正常运行。它运行没有问题。然后我开始删除C ++示例,尝试制作一个非常简单的MEX来测试设备。

这是我的代码中剩下的内容:

#include <iostream>
#include <fstream>
#include <conio.h>
#include <sstream>
#include <windows.h>
#include <map>

#include "myDevice.h"
#include "mex.h"

#pragma comment(lib, "myDevice.lib")

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    int state = EngineConnect();
    return;
}

第一个列表&#39;包括&#39;直接来自他们的例子,因为我不太确定这里实际需要什么。

尝试使用以下方法生成MEX:

mex -lmyDevice.lib EngineConnect.cpp

导致了这个错误:

Error using mex
   Creating library EngineConnect.lib and object EngineConnect.exp
EngineConnect.obj : error LNK2019: unresolved external symbol __imp_EngineConnect referenced in function
"void __cdecl mexFunction(void)" (?mexFunction@@YAXXZ)
EngineConnect.mexw64 : fatal error LNK1120: 1 unresolved externals

我确信.lib文件位于正确的位置(重命名它导致找不到文件&#39;错误)并且函数名称是正确的,因为重命名myDevice.h中的EngineConnect函数文件结果:

Error using mex
EngineConnect.cpp
C:\Code\Tests\EngineConnect.cpp(17) : error C3861: 'EngineConnect': identifier not found

所以我不明白未解决的外部错误是指什么,或者如何解决它。

虽然我对Matlab有着悠久的历史,但我之前基本上从未使用过MEX文件,所以,再一次,我可能会忽略一些基本的东西。但是,浏览文档并没有帮助。另外,首先在这里发帖,我希望我对我的问题很清楚。如果它有用,我正在使用Windows 7,SP1,64bit。

编辑。为了简单起见,Amro的更改已在此帖中引入。但是,结果错误没有改变。

0 个答案:

没有答案