2014-08-30 371 views
1

我正在用Matlab编码器试试我的双手。我编写了一个简单的matlab脚本,并生成了相同的C代码(以及必要的头文件)。该MATLAB程序是这样的:未定义的引用'rtIsNaN'

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

在Matlab的编码器,我开始一个新的项目,前提条件a作为10x1载体,并建立了项目产生的.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生成,传递一个小数组并打印传递数组的最小值的索引。我将包含main()的c文件放在与包含所有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
+0

“当我尝试编译...”时 - 您应该编辑您的问题,以确切指示您如何编译,包括所有标志。 – horchler 2014-08-30 22:27:56

+0

@horchler完成。 – Abhinav 2014-08-30 22:31:46

+0

是否有你在main.c中包含''rt_nonfinite.h''的原因?编码器输出了'rt_nonfinite.h'吗?其中是否定义了“rtIsNaN”? – horchler 2014-08-30 22:33:53

回答

2

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

0

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

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

gcc main.c fminidx.a -o fminidx 

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