Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Mex函数未解析外部_C++_Matlab_Mex - Fatal编程技术网

C++ Mex函数未解析外部

C++ Mex函数未解析外部,c++,matlab,mex,C++,Matlab,Mex,我试图在MATLAB中构建一个mex函数。函数依赖于C++库。然而,无论我做什么,我都会在MATLAB中得到未解析的外部。我创建了三个简单的文件来演示这个问题: my_test123.h my_test.cpp 我使用以下命令编译并链接上面的两个文件: cl /LD /Femy_test.dll my_test.cpp 这将生成两个文件,my_test.lib和my_test.dll 第三个文件是一个普通的MEX函数: my_mex.cpp 在MATLAB中,我使用以下命令: mex -v

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

my_test123.h

my_test.cpp

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

cl /LD /Femy_test.dll my_test.cpp
这将生成两个文件,my_test.lib和my_test.dll

第三个文件是一个普通的MEX函数:

my_mex.cpp

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

mex  -v my_mex.cpp my_test.lib
我还尝试:

mex  -v my_mex.cpp -lmy_test.lib
所有文件都在同一个目录中,并且mex命令正在查找.lib文件(如果我尝试使用随机名称而不是我的_test.lib,则会出现“未找到文件”错误)

我得到的错误是:

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

我也尝试过将每个文件都变成C文件(删除外部文件并将MexFunctionon扩展名改为.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位的

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

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

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

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

看起来取决于MEX函数文件的扩展,Matlab将其编译为C或C++文件。知道这一点,外部使用应该有意义。

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

#include "mex.h"

extern "C" {
void my_test(); 
}

/* The gateway function */
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
    my_test();
}
mex  -v my_mex.cpp my_test.lib
mex  -v my_mex.cpp -lmy_test.lib