2009-03-18 3 views
1

私は作業しているCコードをいくつか手に入れました。動作するはずです。オブジェクトファイルをリンクしようとすると、mainのgetLine関数の "outputBusへの未定義参照"というエラーが表示されます。私は関数名の前にアンパサンドの有無にかかわらず試しました。 gcc -ansiでコンパイルします。何が間違っているのですか?Cの別の関数に関数を渡します。私は間違っていますか?

typedef void(*DualOutput)(const int, const int); 
typedef void(*TripleOutput)(const int, const int, const double); 

void passenger(node**, node**, itemtype*); 
double bus(node**, node**, itemtype*); 
int getLine(itemtype*, DualOutput, DualOutput); 
void getLines(node**, node**, DualOutput, DualOutput, TripleOutput); 
void outputBus(const int, const int); 
void outputPeople(const int, const int); 
void outputTotal(const int, const int, const double); 

int main(int argc, char **argv){ 
    node *head = NULL; 
    node *tail = NULL; 

    getLines(&head, &tail, outputBus, outputPeople, outputTotal); 
    return 0; 
} 
+1

それはあなたがオブジェクトファイルを好きにしようと、おそらくあなたがそれらをリンクしたいといいです。 ;) – Svante

答えて

9

これらの関数にはコード内の任意の場所がありますか? main関数の前のこれらの行はすべて、関数宣言(別名プロトタイプ)のみです。実際には、関数を作成して実装する必要があります。

関数宣言は、関数がコードの後のどこか(または別のオブジェクトファイル)に存在するとコンパイラが約束するため、不平を言わない。リンカは、あなたが約束を破って、怒っているのを見ます。

+1

+1は約束の類推を愛する –

+1

+1は怒っているリンカのために:) – qrdl

1

"未定義の参照"は、リンカーがメソッドの実装を見つけることができないというエラーです。それが別のソースファイルで定義されている場合は、両方をコンパイルしてリンクしていますか?ライブラリ内にある場合は、ライブラリにリンクしていますか(gccのlibfooの-lfooオプションを使用)?

1

「プラグインされていますか?質問を入力作業を開始します

  • は、あなたが実際に機能どこでもoutputBus()outputPeople()、およびoutputTotal()を実装しましたか?

  • もしそうなら、そのモジュールはリンクに含まれていましたか?

出力関数は宣言されていますが、定義されていません。リンクに含まれるオブジェクトファイルの定義がないと、実際には未定義の参照になります。リンカは、それらの関数を定義する必要があることを伝えようとしています。

1

あなたは関数を宣言しましたが、どこにでも実装していません。 これは単に関数を宣言:

void outputBus(const int, const int); 
関連する問題