未定义的参考`rtIsNaN”(undefined reference to `rtIsNaN

2019-10-20 20:21发布

我想我的手用Matlab编码器。 我写了一个简单matlab脚本,并生成相同的C代码(有必要的标头一起)。 在MATLAB脚本如下所示:

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

在Matlab的编码器,我开始一个新项目,前置条件a10x1载体,并建立了项目产生的.c.h文件。 该I写一个新.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()在同一个目录中包含所有一个matlab产生.c.h文件。 另外,我包括在相应的集管main() C文件如上面可以看出。 当我尝试使用编译gcc file1.c findminidx.c ,它产生以下错误。

未定义的参考`rtIsNaN”

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

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

Answer 1:

你已经执行#included rt_nonfinite.h(根据需要),但你不告诉编译器在你的编译行中使用rt_nonfinite.c。



Answer 2:

如果你要在其上运行MATLAB使用生成的代码在同一台机器上,你可以简单地让编码器编译所有生成的代码对你有它生成静态库(某文件)。 选择在编码器项目的输出类型下拉菜单“静态库”。 编码器将生成C代码和编译所有的成静态库, findminidx.a ,在所有的代码生成的目录。

然后,你可以对链接该库,而不需要手动编译所有生成的代码:

gcc main.c fminidx.a -o fminidx

另外,您也可以选择项目的生成选项卡上的“可执行文件”,然后指定你main.c在编码器项目。 生成代码后,一个独立的可执行文件将使用您提供的主要功能进行编译。



文章来源: undefined reference to `rtIsNaN'