2013-10-10 10 views
7

申し訳ありません、これは繰り返し質問ですが、私は数時間にわたって検索していますが、矛盾する回答が...作業しています。Eclipse/GCC:Extern変数への未定義参照

これは簡単なことです。私は多くのソースファイルを持っており、私は単一のファイルに存在するいくつかの一般的なパラメータ、例えば "Parameters.h"を持っています。私はこれらのパラメータを(実行時に)プログラムに引数として渡すことによって設定したい。

PS:関数の引数としてすべてを渡すのが良い方法だとわかっていますが、それはちょっとしたコードですが、あまりにも多くの変更を加えることなくすぐに結果を得る必要があります。ここ

が最小実施例である:

Parameters.h

#ifndef PARAMETERS_H_ 
#define PARAMETERS_H_ 

extern int Alpha; 

#endif 

main.cppに

#include <iostream> 
#include "Parameters.h" 

int main(int argc, char * argv[]) 
{ 
    const int Alpha = 12.0; 
} 

Functions.cpp

私は

gcc main.cpp Functions.cpp 

でコンパイルする場合

#include "Parameters.h" 

double Foo(const double& x) 
{ 
    return Alpha*x; 
} 

は私がエラー ":`アルファ」への未定義参照Functions.cpp :(テキスト+は0xa)" を取得します。

答えて

17

Alphaという名前のグローバル変数が宣言されていますが、定義していません。正確に一つのソースファイルで、ファイルスコープで書く:

int Alpha; 

または初期化子を持つ:Alphaあなたがmain内で定義されているという名前のローカル変数がよりはっきりとこれに完全に無関係であることを

int Alpha = 42; 

注意をグローバル変数。

+0

ありがとうございました!あなたが言うように、main.cppのファイルスコープにAlphaを定義していないという問題がありました。今私は馬鹿のように感じます:-)もう一度おねがいします。 – MGA

+0

宣言がヘッダファイルにあると考えて、Alphaを 'extern'として定義する必要はありますか? – ldgorman

+1

@ldgorman: 'extern'を使用しない場合は、単に宣言ではなく定義になります。このヘッダーを複数のソースファイルに含めると、同じシンボルの複数の定義に関するリンカーエラーが発生します。 –

関連する問題