mex文件编译没有错误但不能在matlab中工作

时间:2014-12-09 16:22:05

标签: matlab visual-studio 64-bit mex

首先,我想编译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. 在(1)第二步中将“mexversion.rc”从“matlab \ extern \ include”添加到项目中但是这个文件在我的计算机中不存在,所以我做不到。

  2. 在Visual Studio中,我需要在下面添加两个标题来编译程序。

    • 包括“stdafx.h”

    • 包括“maxrix.h”

  3. 所以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");
    }
    

3 个答案:

答案 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并删除包含。


printfmexPrintf

在进入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文件。详细信息在引用的帖子中,但您只需要:

  1. 设置MATLAB_ROOT环境变量。
  2. 创建一个新的DLL项目。
  3. 在Property Manager下(从View菜单),右键单击每个项目的构建配置和“Add Existing Property Sheet ...”,选择MATLABx64.props file from this GitHub repo

答案 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)

如何编译C / CPP文件并创建在Matlab中使用的mex文件

我通过@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;一般

  1. 将目标延伸设为 .mexw64

  2. 将配置类型设置为动态库(.dll)

  3. 配置素材 - &gt; VC ++目录:

    5.添加$(MATLAB_ROOT)\ extern \ include;到包含目录

    配置属性 - &gt;链接器 - &gt;一般:

    1. 添加$(MATLAB_ROOT)\ extern \ lib \ win64 \ microsoft; 其他图书馆目录
    2. 配置属性 - &gt;链接器 - &gt;输入:

      1. 将这些内容添加到其他相关性
      2. <强> libmx.lib

        <强> libmex.lib

        <强> libmat.lib

        配置属性 - &gt;链接器 - &gt;命令行:

        1. / export:mexFunction 添加到其他选项
        2. 现在你必须将你的平台设置为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

          1. 创建一个空项目,而不是MFC Dll项目。
          2. 不需要* .def文件。
          3. 无需添加&#34; mexversion.rc&#34;进入你的项目。
          4. 无需添加&#34; MATLAB_MEX_FILE&#34;作为预处理器定义。