【问题标题】:mex file compiled without errors but not working in matlabmex 文件编译没有错误,但在 matlab 中不起作用
【发布时间】:2014-12-09 16:22:05
【问题描述】:

首先我想编译 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 当我输入 test 输出是 Hello! :)

我也可以按照下面的教程设置正确的配置,编译不会出错。

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

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

    • 包括“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");
}

【问题讨论】:

    标签: matlab visual-studio 64-bit mex


    【解决方案1】:

    预编译的标头恶作剧

    Visual Studio 版本代码的一个问题是预编译的头文件 stdafx.h 导致编译器忽略它上面的任何代码(mex.h 包含):

    #include "mex.h"
    #include "stdafx.h" // ANYTHING above here is IGNORED!
    #include "matrix.h"
    

    将 stdafx.h 包含移动到顶部或在项目设置中关闭 PCH 并删除包含。


    printfmexPrintf

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

    #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. 在属性管理器下(从视图菜单),右键单击每个项目的构建配置和“添加现有属性表...”,选择MATLABx64.props file from this GitHub repo

    【讨论】:

    • 真的很不错。谢谢你的解释。
    【解决方案2】:

    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”口径相同:)


    祝你好运!

    【讨论】:

    • @rayryeng 我使用了 mexPrintf 并且 IntelliSense 识别了它,但我收到了这个错误:错误 2 错误 C3861: 'mexPrintf': identifier not found
    • @Iman - 在其中编译 MATLAB。不要在VS中编译它。此外,如果您希望在 VS 中成功编译,则需要包含 mexversion.rc 的步骤。编译代码的最佳方法是直接在 MATLAB 中进行。所有的依赖都设置好了。
    • @rayryeng 正如我所提到的,我可以在 Matlab 中编译它!我想在VS中编译它。因为我想在VS中编译MatConvNet。
    • @Iman - 无论如何,printf 不会显示任何内容,因为 MATLAB 不会在命令提示符中显示该输出。您需要使用mexPrintf。您是否尝试过 mex.h 的任何其他方法来查看您是否收到该错误?您更有可能没有正确设置环境。但是,如果您打印出调试语句并不谨慎,那么您可以根本不使用它。
    • @rayryeng 我怎样才能得到“mexversion.rc”?我的电脑里没有这个文件!!!即使我安装了 Matlab R2011b,但该版本中也不存在。我能做什么?
    【解决方案3】:

    如何编译 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中新建一个项目->Visual C++->通用->空项目。 您的项目名称将是 mex 文件的名称。 您可以稍后更改。

    2.将Debug改为Release

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

    1. 将目标扩展设置为 .mexw64

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

    配置属性 -> VC++ 目录:

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

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

    1. 添加 $(MATLAB_ROOT)\extern\lib\win64\microsoft;到其他库目录

    配置属性->链接器->输入:

    1. 将这些内容添加到其他依赖项

    libmx.lib

    libmex.lib

    libmat.lib

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

    1. /export:mexFunction 添加到其他选项

    现在您必须将平台设置为 x64,否则您将收到类似“错误 1 ​​错误 LNK2001:未解析的外部符号 _mexPrintf”之类的错误。

    9.Configuration Properties -> Configuration Manager -> Active Solution Platform -> New -> x64 -> Copy Settings From Win32

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

    如果您看到这些教程,还有其他不需要的东西,可能会导致问题。 (http://coachk.cs.ucf.edu/GPGPU/Compiling_a_MEX_file_with_Visual_Studio2.htm)

    1. 创建一个空项目,而不是 MFC Dll 项目。
    2. 不需要 *.def 文件。
    3. 无需将“mexversion.rc”添加到您的项目中。
    4. 无需添加“MATLAB_MEX_FILE”作为预处理器定义。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多