我正在使用Visual Studio 2012 x64直接构建和调试MATLAB 2014a x64 mex文件(不使用MATLAB中的mex
命令)。我按照this question中的说明设置了名为test1
的Visual Studio项目。我跟着this tutorial编写了一个简单的mex文件test1.cpp
:
#include <math.h>
#include <matrix.h>
#include <mex.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mexPrintf("Hello World!\n");
}
构建此解决方案会给我这样的信息:
> 1>------ Build started: Project: test1, Configuration: Debug Win32
> ------ 1> Creating library C:\PROJECTS\matlab\mex\test1\Debug\test1.lib
> and object
> C:\PROJECTS\matlab\mex\test1\Debug\test1.exp
> 1>test1.obj : error LNK2019: unresolved external symbol _mexPrintf
> referenced in function _mexFunction 1>MSVCRTD.lib(crtexe.obj) : error
> LNK2019: unresolved external symbol _main referenced in function
> ___tmainCRTStartup 1>C:\PROJECTS\matlab\mex\test1\Debug\test1.mexw64
> : fatal error LNK1120: 2 unresolved externals
> ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我是否缺少配置步骤?我完全使用了this answer中的步骤,但对于更新版本的MATLAB,它可能不完整?
答案 0 :(得分:3)
您需要创建一个生成DLL的Visual Studio项目(而不是控制台或GUI应用程序)。 MEX文件基本上是带有自定义扩展的共享库(Windows上为*.mexw32
或*.mexw64
)
错误消息表明链接器找不到可执行文件的入口点函数main()
,而动态库不存在该函数。
为了它的价值,您可以在MATLAB中运行mex -v ...
,这样就会向您显示用于调用编译器和链接器的确切命令。
分步说明:
创建一个新的空VS项目来构建DLL(Visual C++ > Win32 > Win32 console application
然后在向导中将类型设置为DLL
)
由于我们正在使用MATLAB x64,我们需要调整项目配置以生成64位二进制文件。从Build
菜单中选择Configuration Manager
。从下拉菜单中选择<New>
以创建新的平台配置,选择x64
并接受。
按照您之前提到的instructions
添加MEX文件的C / C ++源代码
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
plhs[0] = mxCreateString("hello world");
}
将平台切换到&#34; x64&#34;在&#34;发布&#34;模式,并构建项目。现在你应该有一个somefile.mexw64
MEX文件,你可以在MATLAB中调用它作为常规函数。