Mex 函数未解析的外部

Mex function unresolved external

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

my_test123.h

_declspec(dllexport) void my_test();

my_test.cpp

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

我编译并link上面的两个文件使用命令:

cl /LD /Femy_test.dll my_test.cpp

这会生成两个文件,my_test.libmy_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 ,我会收到找不到文件的错误)。

我得到的错误是:

Error using mex Creating library my_mex.lib and object my_mex.exp my_mex.obj : error LNK2019: unresolved external symbol my_test referenced in function mexFunction my_mex.mexw64 : fatal error LNK1120: 1 unresolved externals

我也尝试过将每个文件都设为 C 文件(删除 externs 并将 mexfunciton 扩展名更改为 .c)并在 C 中编译。但我得到了完全相同的错误。

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

非常感谢任何帮助。

经过数小时的研究和 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++ 文件。知道这一点,extern 用法应该是有意义的。

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