c++ - Mex 函数未解析的外部

标签 c++ matlab mex

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

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.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?
  • 您如何使用外部“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。

关于c++ - Mex 函数未解析的外部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35134314/

相关文章:

python - 直接在 Python 中嵌入来自 Matlab MEX 文件的函数

c++ - 使用 OpenCV 中的相机校准参数将 2D 点投影到 3D 空间

matlab - 在 Matlab 中向量化数组索引/子集

c++ - 如何设置填充有 mxSetData 的 mxArray 的 classID?

matlab - 在 matlab 中生成 3D 均匀网格

matlab - 忽略循环中的警告并继续

matlab - 如何在 mex 文件中调用 imresize(MATLAB)

c++ - 使用 openmp 进行 LU 分解

c++ - C++ lambda 和静态变量的预期行为

c++ - 将 sockaddr_storage 复制到另一个 sockaddr_storage 更改地址