2014-08-30 34 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在編碼器項目中。代碼生成後,將使用您提供的主函數編譯獨立的可執行文件。