web-dev-qa-db-ja.com

「(一部の関数)への未定義参照」というエラーの原因は何ですか?

エラーが表示されます:

main.o(.text+0x1ed): In function `main':
: undefined reference to `avergecolumns'
collect2: ld returned 1 exit status

gcc * .oの場合このエラーの原因はよくわかりません。他のポスターは、関数が見つからないか、関数が空であると説明しています。誰かが明確にしたり洗練したりすることができれば、それは大歓迎です!

ここに私の関数のコードがあります(2D配列の列の平均を計算しようとしています):

#include "my.h"

void averagecolumns (int x, int y, int** a)
{
    int i;
    int j;
    float sum;
    float colAvg;

    sum = 0;
    colAvg = 0;

    printf("i.  The column averages are: \n");
    for(i = 0; i < x; i++)
        {
            for(j = 0; j < y; j++)
                {
                    sum += a[i][j];
                    colAvg = sum / (float)x;
                }
            printf("Column: %3d, Average: %6.2f", j, colAvg);
            sum = 0;   
            colAvg = 0;
        }

Mainの関連部分は次のとおりです。

#include "my.h"

int main (int argc, char* argv[])
{
     int** a;
     float** colAvg;
     int ROWS;
     int COLS;
     int i;
     int j;
     int** table;
     FILE* fpmyfile;
     int closeResult;

....

             printme (ROWS, COLS, a);                              // call functions a - j
             oddvalues (ROWS, COLS, a);
             oddlocations (ROWS, COLS, a);
             countoddrows (ROWS, COLS, a);
             addrows (ROWS, COLS, a);
             findfirstsmall (ROWS, COLS, a);
             findlastlarge (ROWS,COLS, a);                          
             addcolumns (ROWS, COLS, a);
             avergecolumns (ROWS, COLS, a);

....

}

また、これはリンカまたはコンパイルエラーです(どのタグを追加するのかわかりませんでした)。

14
Piseagan

リンカーエラーです。 ldはリンカーであるため、「ld return 1 exit status」で終わるエラーメッセージが表示された場合、それはリンカーエラーであることを示しています。

エラーメッセージは、リンクしているオブジェクトファイルにavergecolumnsの定義が含まれていないことを示しています。その理由は、定義した関数がaveragecolumnsと呼ばれるためです(言い換えると、関数を呼び出すときに関数名のスペルを間違えました(おそらくヘッダーファイルでも-そうでない場合は、コンパイル時の別のエラー))。

24
sepp2k