首先,我想编译MatConvNet库,以便在本教程的Windows窗体中使用 (Compiling MatConvNet on Windows) 但我不能。然后我认为最好编译一个非常简单的文件,之后再编译库。
我有 Matlab R2013a 64位和 Visual Studio 2010 64位。
我的程序Test.cpp
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
{
printf("Hello! :)\n");
}
我可以使用 mex Test.cpp 在matlab中编译Test.cpp 当我输入测试输出你好! :)
我也可以根据下面的教程设置正确的配置,并编译它没有错误。
1)http://coachk.cs.ucf.edu/GPGPU/Compiling_a_MEX_file_with_Visual_Studio2.htm
2)http://www.orangeowlsolutions.com/archives/490
但是当我在Matlab中运行时,没有任何事情发生。没有输出,Matlab也没有给我任何错误。
有什么问题?
请注意:
在(1)第二步中将“mexversion.rc”从“matlab \ extern \ include”添加到项目中但是这个文件在我的计算机中不存在,所以我做不到。
在Visual Studio中,我需要在下面添加两个标题来编译程序。
所以Visual Studio中的 Test.cpp 是:
#include "mex.h"
#include "stdafx.h"
#include "matrix.h"
void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
{
printf("Hello! :)\n");
}
答案 0 :(得分:3)
预编译标题shenanigans
代码的Visual Studio版本的问题是预编译的头文件stdafx.h 导致编译器忽略它上面的任何代码(mex.h include):
#include "mex.h"
#include "stdafx.h" // ANYTHING above here is IGNORED!
#include "matrix.h"
将stdafx.h include移至顶部或在项目设置中关闭PCH并删除包含。
printf
与mexPrintf
在进入MEX项目设置之前,请注意printf
指向mexPrintf
mex.h
的{{1}}:
#define printf mexPrintf
因此,使用printf
不是问题,但可能不是很好的做法。如果在包含mex.h之后重新定义printf
或由于PCH标题而无法获得此定义,则会出现问题。
关于Visual Studio中的MEX
我发布了一个更正式的guide to setting up a Visual Studio projects for building MEX files作为对此主题的更常见参考问题的答案,我还建议使用Visual Studio属性表来设置项目以构建MEX文件。详细信息在引用的帖子中,但您只需要:
MATLAB_ROOT
环境变量。答案 1 :(得分:1)
printf
仅适用于原生C.您需要使用mexPrintf
。因此,您的代码应为:
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
{
mexPrintf("Hello! :)\n");
}
通常,在MEX脚本中打印到标准输出并不会出现在MATLAB命令提示符中。如果要在MATLAB中显示消息,则需要使用mexPrintf
而不是printf
。
明确地说,如果您查阅mexPrintf
文档,可以在最后看到警告:
在C MEX文件中,您必须调用mexPrintf而不是printf来显示字符串。
顺便说一句,我在这里推荐这个很棒的MEX教程:http://classes.soe.ucsc.edu/ee264/Fall11/cmex.pdf。这是我用来开始在MATLAB中编写MEX包装器的教程。您还会看到第一个示例是相同的" Hello World"你想要跑步的口径:)
答案 2 :(得分:0)
我通过@rayryeng帮助和(How to build mex file directly in Visual Studio?)@ jorre的帖子找到了解决方案。
使用 Matlab R2013a 64位和 Visual Studio 2010 64位进行测试。
<强> Test.cpp的强>
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
{
mexPrintf("Hello World123! :)\n");
}
1.在VS中创建一个新项目 - &gt; Visual C ++ - &gt;一般 - &gt;空项目。 您的项目名称将是mex文件的名称。 您可以稍后更改。
2.将调试更改为发布。
右键点击该项目 - &gt;属性 - &gt;配置属性 - &gt;一般
将目标延伸设为 .mexw64
将配置类型设置为动态库(.dll)
配置素材 - &gt; VC ++目录:
5.添加$(MATLAB_ROOT)\ extern \ include;到包含目录
配置属性 - &gt;链接器 - &gt;一般:
配置属性 - &gt;链接器 - &gt;输入:
<强> libmx.lib 强>
<强> libmex.lib 强>
<强> libmat.lib 强>
配置属性 - &gt;链接器 - &gt;命令行:
现在你必须将你的平台设置为x64,否则你会得到错误,例如&#34;错误1错误LNK2001:未解析的外部符号_mexPrintf&#34;。
9.配置属性 - &gt;配置管理器 - &gt;有源解决方案平台 - &gt;新 - &gt; x64 - &gt;从Win32复制设置
现在您可以编译文件并获取mex文件。
如果您看到这些教程,则还有其他不需要的东西,可能会导致问题。 (http://coachk.cs.ucf.edu/GPGPU/Compiling_a_MEX_file_with_Visual_Studio2.htm)