1

我正在尝试使用 Matlab 编码器。我编写了一个简单的matlab脚本并为此生成了 C 代码(以及必要的标头)。matlab 脚本如下所示:

function amin_idx=findminidx(a)%#codegen
amin_idx=find(a==min(a),1,'first');

在 Matlab 编码器中,我启动了一个新项目,将前置条件a作为10x1向量并构建项目以生成.c.h文件。我写了一个包含如下的新.c文件:main()

#include<stdio.h>
#include "rt_nonfinite.h"/*from generated code*/
#include "findminidx.h"/*from generated code*/

void main(void){
  double a_data[3]={6,5,4};
  int a_size[2]={3,1};
  double amin_idx_data[1]={-1};
  int amin_idx_size[2]={1,1};
  findminidx(a_data,a_size,amin_idx_data,amin_idx_size);/*from generated code*/
  printf("\namin_idx = %f\n",amin_idx_data[0]);
}

包含的.c文件(生成)findminidx()如下:

/*
 * File: findminidx.c
 *
 * MATLAB Coder version            : 2.6
 * C/C++ source code generated on  : 30-Aug-2014 18:04:42
 */

/* Include files */
#include "rt_nonfinite.h"
#include "findminidx.h"

/* Function Definitions */

/*
 * Arguments    : const double a_data[]
 *                const int a_size[2]
 *                double amin_idx_data[]
 *                int amin_idx_size[2]
 * Return Type  : void
 */
void findminidx(const double a_data[], const int a_size[2], double
                amin_idx_data[], int amin_idx_size[2])
{
  int ixstart;
  double mtmp;
  int ix;
  boolean_T exitg2;
  boolean_T x_data[10];
  int k;
  int ii_data[1];
  boolean_T exitg1;
  int b_ii_data[1];
  ixstart = 1;
  mtmp = a_data[0];
  if (a_size[1] > 1) {
    if (rtIsNaN(a_data[0])) {
      ix = 2;
      exitg2 = false;
      while ((!exitg2) && (ix <= a_size[1])) {
        ixstart = ix;
        if (!rtIsNaN(a_data[ix - 1])) {
          mtmp = a_data[ix - 1];
          exitg2 = true;
        } else {
          ix++;
        }
      }
    }

    if (ixstart < a_size[1]) {
      while (ixstart + 1 <= a_size[1]) {
        if (a_data[ixstart] < mtmp) {
          mtmp = a_data[ixstart];
        }

        ixstart++;
      }
    }
  }

  ixstart = a_size[0] * a_size[1];
  for (ix = 0; ix < ixstart; ix++) {
    x_data[ix] = (a_data[ix] == mtmp);
  }

  if (1 <= a_size[1]) {
    k = 1;
  } else {
    k = 0;
  }

  ixstart = 0;
  ix = 1;
  exitg1 = false;
  while ((!exitg1) && (ix <= a_size[1])) {
    if (x_data[ix - 1]) {
      ixstart = 1;
      ii_data[0] = ix;
      exitg1 = true;
    } else {
      ix++;
    }
  }

  if (k == 1) {
    if (ixstart == 0) {
      k = 0;
    }
  } else {
    if (1 > ixstart) {
      ixstart = -1;
    } else {
      ixstart = 0;
    }

    ix = 0;
    while (ix <= ixstart) {
      b_ii_data[0] = ii_data[0];
      ix = 1;
    }

    k = ixstart + 1;
    ixstart++;
    ix = 0;
    while (ix <= ixstart - 1) {
      ii_data[0] = b_ii_data[0];
      ix = 1;
    }
  }

  amin_idx_size[0] = 1;
  amin_idx_size[1] = k;
  ixstart = k;
  ix = 0;
  while (ix <= ixstart - 1) {
    amin_idx_data[0] = ii_data[0];
    ix = 1;
  }
}

/*
 * File trailer for findminidx.c
 *
 * [EOF]
 */

目的是,调用从.c生成的例程matlab,传递一个小数组并打印传递数组的最小值的索引。我将包含的 c 文件与包含所有生成的文件main()的目录放在同一目录中。此外,如上所示,我在 c 文件中包含了相应的头文件。当我尝试使用 编译时,会产生以下错误。matlab.c.hmain()gcc file1.c findminidx.c

未定义对“rtIsNaN”的引用

我不明白这是为什么?我的系统详细信息如下:

  1. Ubuntu 14.04,64 位
  2. Matlab R2014a,64 位
  3. gcc 版本 4.8.2
4

2 回答 2

2

您已经#included rt_nonfinite.h(根据需要),但您没有告诉编译器在编译行中使用 rt_nonfinite.c。

于 2014-08-30T22:44:03.407 回答
0

如果您打算在运行 MATLAB 的同一台机器上使用生成的代码,您可以简单地让 Coder 为您编译所有生成的代码,方法是让它生成一个静态库(.a 文件)。在 Coder 项目的输出类型下拉列表中选择“静态库”。Coder 将生成 C 代码并将其全部编译到一个静态库中findminidx.a,位于生成所有代码的目录中。

然后,您可以只链接该库,而无需手动编译所有生成的代码:

gcc main.c fminidx.a -o fminidx

或者,您可以在项目的构建选项卡上选择“可执行”并main.c在 Coder 项目中指定您的。生成代码后,将使用您提供的 main 函数编译一个独立的可执行文件。

于 2014-08-31T10:55:48.953 回答