Mex功能未解决外部问题

时间:2016-02-01 15:32:30

标签: c++ matlab mex

我正在尝试在MATLAB中构建一个mex函数。该函数依赖于C ++库。但是,无论我做什么,我都会在MATLAB中获得未解析的外部因素。我创建了三个简单的文件来演示这个问题:

my_test123.h

_declspec(dllexport) void my_test();

my_test.cpp

extern "C" {
#include "my_test123.h"
}
void my_test() {
}

我使用以下命令编译并链接上面的两个文件:

cl /LD /Femy_test.dll my_test.cpp

这会生成两个文件, my_test.lib my_test.dll

第三个文件是一个简单的mexfunction:

my_mex.cpp

#include "mex.h"

extern "C" {
void my_test(); 
}

/* The gateway function */
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
    my_test();
}

在MATLAB中,我使用以下命令:

mex  -v my_mex.cpp my_test.lib

我也尝试过:

mex  -v my_mex.cpp -lmy_test.lib

所有文件都在同一个目录中,而mex命令正在查找.lib文件(如果我尝试使用随机名而不是my_test.lib,我会收到一个找不到文件的错误。)

我得到的错误是:

  

使用mex时出错      创建库my_mex.lib和对象my_mex.exp   my_mex.obj:错误LNK2019:函数mexFunction中引用的未解析的外部符号my_test   my_mex.mexw64:致命错误LNK1120:1个未解析的外部

我还尝试将每个文件都设置为C文件(删除externs并将mexfunciton扩展名更改为.c)并在C中编译。但是我得到了同样的确切错误。

我正在使用Visual Studio 2013和64位版本的MATLAB 2014b。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

经过几个小时的研究和MathWorks支持热线的帮助,我发现了以下内容:

您需要考虑几个因素:

  • 您的MATLAB是32位还是64位?
  • 是mexfunction .c或.cpp?
  • 的扩展名
  • 你是如何使用extern“C”的?
  • .dll是64位.dll还是32位.dll?

我们假设.dll是32位.dll而MATLAB是32位

mex函数有一个扩展名.cpp,。dll是一个C ++ .dll 您不需要在my_test.cpp或my_mex.cpp中添加任何 extern“C”

mex函数有一个扩展名.c,.dll是一个C ++ .dll 你需要在my_test.cpp中添加“extern”C“*。

mex函数有一个扩展名.cpp,.dll是一个C .dll 您不需要将 extern“C”添加到my_test.cpp,但是在my_mex.cpp中需要一个。

mex函数有一个扩展名.c,.dll是一个C .dll 您不需要在my_test.cpp或my_mex.cpp中添加任何 extern“C”

看起来取决于mex函数文件的扩展名,MATLAB将其编译为C或C ++文件。知道这一点,外部使用应该是有道理的。

上述所有内容仍然有效,但对于64位MATLAB,但需要64位dll。