2011-02-05 1 views
0

申し訳ありません。だから、私はGLUTで使用したい関数の変更を扱うために、C++でかなりシンプルなクラスを設定しています。しかし、私は、クラス定義を含むヘッダーファイルに対応する.cppファイル内のパブリックメンバー関数の1つを定義するときに問題があります。このパブリックメンバー関数を別のファイルで宣言するときに重複するシンボルが表示されるのはなぜですか? (C++)

ヘッダーファイルでクラスを定義するとき、コンパイルエラーは発生しません。しかし、ヘッダファイルをインクルードして.cppファイルに関数を定義すると、 "duplicate symbol SystemModule::setupGlutFunctions"というエラーが出ます。私が知る限り、この関数をオリジナルとは別のファイルで定義するための正しい構文を使用しています。ここでは、コードは次のとおりです.hファイルで宣言されたときには、クラス定義の内部で、細かいコンパイルとコードの

#include "system.h" 

void SystemModule::setupGlutFunctions() 
{ 
glutDisplayFunc(displayFunc); 
glutReshapeFunc(reshapeFunc); 
glutMouseFunc(mouseFunc); 
glutKeyboardFunc(keyboardFunc); 
glutSpecialFunc(specialFunc); 
glutIdleFunc(idleFunc); 
glutMotionFunc(motionFunc); 
glutPassiveMotionFunc(passiveMotionFunc); 

return; 
} 

実際の内容は本当に重要ではありません。しかし、別の.cppファイルで関数を定義しようとすると、エラーが発生します。それは公共の機能です。

私はMac OS X 10.5でXcodeを使用しています。他の誰かがこのエラーを受け取りましたか?そして、構文上何か間違っているのか、これが動作するためにXcodeで特別なことをしなければならないのか誰にでも教えてくれますか?

多くの義務が

、 E.

+2

ヘッダーの宣言はどのように見えますか?あなたはヘッダーか何かにそれをスタブしなかったのですか? –

+0

"void setupGlutFunctions();"それはどのように見えるのですか? –

答えて

3

これは何とかあなたがsetupGlutFunctionsコードの二つの異なるコピーをコンパイルし、それらをリンクしようとしていることを示唆しているリンカエラー、ないコンパイラエラー、のように見えます一緒に。これは、同じ実装で2つの異なるファイルがリンクされていることが原因である可能性があります。

可能な候補 - #include - .hファイルの最後の.cppファイルですか?その場合、#includeのヘッダファイルにsetupGlutFunctions実装の独自のコピーが作成されます。リンク時に、リンカーは関数に複数の異なる定義があることを確認し、探していた多くの同じ実装のどれが不明なのでエラーが発生します。 (@DougTによって上記)

別の可能な候補 - 誤っヘッダに実装を提供した場合、次のように:あなたが実際に関数の2つの実装定義されたそして

class SystemModule { 
public: 
    void setupGlutFunctions() { 
     /* ... */ 
    } 
}; 

- ヘッダ内のいずれかを1つは.cppファイルにあります。これを読み取るように変更する

class SystemModule { 
public: 
    void setupGlutFunctions(); 
}; 

これを修正できます。

+0

まあ、私は.hファイルに.cppファイルを含めていません。これは、関数がヘッダファイルで宣言される方法です: "void setupGlutFunctions();" この宣言に定義を追加すると、コンパイルは正常に行われます。私は機能の署名か何かを壊しましたか? –

+0

@ E_12-あなたが得ているエラーに関する詳細情報を提供できますか?シンボルが以前に定義されていると言っているところはどこですか?その間にきれいなビルドを済ませましたか? – templatetypedef

+0

私はきれいにビルドしました。 \t \t { \t \t \t glutDisplayFunc(displayFunc)) '空隙setupGlutFunctions(;:コードだけ宣言に仮止め、同じです \t \t \t glutReshapeFunc(reshapeFunc); \t \t \t glutMouseFunc(mouseFunc); \t \t \t glutKeyboardFunc(keyboardFunc); \t \t \t glutSpecialFunc(specialFunc); \t \t \t glutIdleFunc(idleFunc); \t \t \t glutMotionFunc(motionFunc); \t \t \t glutPassiveMotionFunc(passiveMotionFunc); \t \t \t \t return; \t \t} ' は、ヘッダーファイル内でどのように見えるかです。他のファイルとまったく同じです。これはエラーや警告なしで構築されます。 –

関連する問題