我正在尝试在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。
非常感谢任何帮助。
答案 0 :(得分:2)
经过几个小时的研究和MathWorks支持热线的帮助,我发现了以下内容:
您需要考虑几个因素:
我们假设.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。