【问题标题】:Issues with a mex mxGetDoubles() function when compiling编译时 mex mxGetDoubles() 函数的问题
【发布时间】:2019-07-23 15:06:43
【问题描述】:

每当我尝试编译我的非常简单的测试 mex 函数时,都会出现错误

“未定义对 `mxGetDoubles' 的引用
collect2.exe:错误:ld 返回 1 个退出状态

我正在使用 Matlab R2019a,mingw-w64 6.3.0。他们提供的示例 c 文件 (explore.c) 编译得很好,并且还使用了mxGetDoubles()

我尝试过使用mxGetPr(),尽管他们说他们不推荐它,并且在文档中的 matlab R2018a 之后它不应该工作,但效果很好。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mex.h"
#include "matrix.h"



void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
    mxDouble *vertices;


    vertices = mxGetDoubles(prhs[1]);//mxGetPr(prhs[1]);

}

【问题讨论】:

  • 消息似乎不是来自编译器本身,而是来自链接器(意思是:缺少库)或来自加载器(意思是:缺少 dll)。
  • @PaulOgilvie 当我调用 ``` mex fileName.c `` 时出现 matlab 错误,但同样奇怪的是,旧函数和使用相同函数的示例 c 文件两者都有效。
  • 好像和32/64位有关系,但我没找到解决办法。
  • @AnderBiguri 我刚刚使用“mex -R2018a fileName.c”进行了尝试,并且编译没有错误。我现在只是在测试它,看看它是否真的有效。它可能与matlab交错API有关

标签: c matlab mex


【解决方案1】:

因为 explore.c 中有测试,第 686 行:

 #if MX_HAS_INTERLEAVED_COMPLEX

【讨论】:

    【解决方案2】:

    事实证明,修复有点简单,我不得不使用 mex -R2018a fileName.c,而不是调用 mex fileName.c

    但这并不能回答为什么mex explore.c 工作,即使它使用相同的功能,所以如果有人知道为什么,我会很感兴趣。我假设它与交错复杂 API 有关,但可能是任何 tbh。

    【讨论】:

      【解决方案3】:

      澄清答案(假设您只使用实数双变量):

      1. 任意使用

        vertices = mxGetDoubles(prhs[1]);
        

        用命令

        mex -R2018a my_system_function.c
        

        (按照你的建议)

      2. 或者你也可以使用

        #if MX_HAS_INTERLEAVED_COMPLEX
            vertices = mxGetDoubles(prhs[1]);
        #else
            vertices = mxGetPr(prhs[1]); // pointer to real part
        #endif
        

        用命令

        mex my_system_function.c
        

        (正如 mpre 所暗示的 - 参见“C:\Program Files\MATLAB\R2019b\extern\examples\mex\explore.c”中的代码)。

      就我而言,我用它来检索更新函数中的函数参数:

      static void mdlUpdate(SimStruct *S, int_T tid)
      {
          const real_T   *u    = (const real_T*) ssGetInputPortSignal(S,0);
          real_T         *x    = ssGetRealDiscStates(S);
          const mxArray  *p_mx = (const mxArray *) ssGetSFcnParam(S, 0);
      
      #if MX_HAS_INTERLEAVED_COMPLEX
          const mxDouble *p    = mxGetDoubles(p_mx);
      #else
          const double   *p    = mxGetPr(p_mx); // pointer to real part
      #endif
      
         //...
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-11
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-29
        • 1970-01-01
        相关资源
        最近更新 更多