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

mex文件编译没有错误,但不能在matlab中工作,matlab,visual-studio,64-bit,mex,Matlab,Visual Studio,64 Bit,Mex,首先,我想编译MatConvNet库,以便在本教程的windows窗体中使用 () 但我不能。然后我认为最好编译一个非常简单的文件,然后再编译库 我有MatlabR2013A 64位和VisualStudio2010 64位 我的程序Test.cpp #include "mex.h" void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]) { printf("Hello! :)\n"); }

首先,我想编译MatConvNet库,以便在本教程的windows窗体中使用 () 但我不能。然后我认为最好编译一个非常简单的文件,然后再编译库

我有MatlabR2013A 64位VisualStudio2010 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 当我输入test时,输出是Hello!:)

我还可以根据下面的教程设置正确的配置,并且编译时不会出错

(一)

(二)

但是当我在Matlab中运行它时,什么都没有发生。没有输出,Matlab不会给我任何错误。

有什么问题吗?

注意:

  • 在(1)中,第二步是将“matlab\extern\include”中的“mexversion.rc”添加到项目中,但我的计算机中不存在此文件,因此我无法执行此操作

  • 在VisualStudio中,我需要在下面添加两个标题来编译程序

    • 包括“stdafx.h”
    • 包括“maxrix.h”
  • 因此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");
    }
    

    printf
    仅适用于本机C。您需要使用。因此,您的代码应该是:

    #include "mex.h"
    void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
    {
        mexPrintf("Hello! :)\n");
    }
    
    通常,打印到MEX脚本中的标准输出不会出现在MATLAB命令提示符中。如果要在MATLAB中显示消息,需要使用
    mexPrintf
    而不是
    printf

    为了明确起见,如果您查阅
    mexPrintf
    文档,可以在末尾看到一个警告:

    在cmex文件中,必须调用mexPrintf而不是printf来显示字符串


    顺便说一句,我推荐这个很棒的MEX教程:。这是我用来开始在MATLAB中编程MEX包装器的教程。您还将看到第一个示例与您尝试运行的“Hello World”口径相同:)


    祝你好运

    如何编译C/CPP文件并创建mex文件以在Matlab中使用 我通过@rayryeng help和()@jorre的帖子找到了解决方案

    这是用Matlab R2013a 64位和Visual Studio 2010 64位测试的

    测试.cpp

    #include "mex.h"
    void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
    {
        mexPrintf("Hello World123! :)\n");
    }
    
    < P> >在VS> >强> VisualC++ > > ->空项目中创建一个新项目。 项目的名称将是mex文件的名称。 您可以稍后更改它

    2.将调试更改为发布

    右键单击项目->属性->配置属性->常规

  • 将目标扩展设置为.mexw64

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

  • 配置权限->VC++目录:

    5.添加$(MATLAB\u ROOT)\extern\include;要包括目录

    配置属性->链接器->常规:

  • 添加$(MATLAB\u ROOT)\extern\lib\win64\microsoft;到附加库目录
  • 配置属性->链接器->输入:

  • 将这些内容添加到附加依赖项中
  • libmx.lib

    libmex.lib

    libmat.lib

    配置属性->链接器->命令行:

  • /export:mexFunction添加到其他选项
  • 现在,您必须将平台设置为x64,否则将出现类似“错误1错误LNK2001:未解析的外部符号\u mexPrintf”的错误

    9.配置属性->配置管理器->活动解决方案平台->新建->x64->从Win32复制设置

    现在您可以编译文件并获取mex文件

    如果您看到这些教程,还有其他不需要的东西,可能会导致问题。 ()

  • 创建一个空项目,而不是MFC Dll项目
  • 不需要*.def文件
  • 没有必要将“mexversion.rc”添加到项目中
  • 无需添加“MATLAB_MEX_文件”作为预处理器定义

  • 预先编译的标题骗局

    Visual Studio版本的代码存在一个问题,即预编译的头文件stdafx.h导致编译器忽略其上的任何代码(mex.h包括):

    将stdafx.h include移到顶部,或在项目设置中关闭PCH并删除include


    printf
    mexPrintf

    进入MEX项目设置之前,请注意,
    printf
    指向
    mexPrintf
    MEX.h
    提供:

    #define printf mexPrintf
    
    因此,使用
    printf
    不是问题,但可能不是好的做法。如果在包含mex.h之后重新定义
    printf
    ,或者由于PCH头而无法获得此定义,则会出现问题


    关于VisualStudio中的MEX

    我发布了一篇更正式的文章,作为对这个主题中更常见的参考问题的回答,我还建议在这里使用VisualStudio属性表来设置您的项目以构建MEX文件。详细信息见参考文章,但您只需:

  • 设置
    MATLAB\u ROOT
    环境变量
  • 创建一个新的DLL项目
  • 在“属性管理器”(从“视图”菜单)下,右键单击每个项目的生成配置并“添加现有属性表…”,选择

  • @rayryeng我使用了mexPrintf,IntelliSense识别了它,但我得到了以下错误:错误2错误C3861:“mexPrintf”:标识符不是found@Iman-在MATLAB中编译。不要在VS中编译。同样,如果要在VS中成功编译,需要包含
    mexversion.rc
    的步骤。编译代码的最佳方法是直接在MATLAB中进行。所有依赖项都设置为u
    #define printf mexPrintf