2016-11-27 5 views
-1

エラーが発生しました私の大きなオペレーティングシステムの宿題を修正する方法がわかりません。私が得ているエラーは、 "x86_64アーキテクチャーの42の重複したシンボル"です。私はグローバル変数ファイル "global.h"と関係があると考えています。私は3つのグローバル変数を使用し、 "global.h"は "PageReplacementAlgorithm.cpp"という抽象クラスに含まれています。私はPageReplacementAlgorithmクラスから派生した約6つのクラスを持っており、これらのグローバル変数を利用しています。私は、私がそれらの新しいインスタンスを作る必要があるので、私が "main.cpp"にこれらの派生クラスをすべて含めると問題が発生すると思います。グローバル変数の実装を修正するにはどうすればよいですか?グローバル変数エラーC++

GLOBAL.H

#include "PageTableEntry.h" 
using namespace std; 
#ifndef Global_H 
#define Global_H 

extern PageTableEntry pageTable[64]; 
extern int* frameTable; 
extern int framesCount; 

#endif 

PageReplacementAlgorithm.h

#include "Global.h" 
using namespace std; 

#ifndef PageReplacementAlgorithm_H 
#define PageReplacementAlgorithm_H 

class PageReplacementAlgorithm { 
public: 
    virtual int selectFrame(PageTableEntry &p) = 0; 
}; 

#endif 

例派生クラス(FIFO)

include "PageReplacementAlgorithm.h" 
using namespace std; 

#ifndef FIFO_H 
#define FIFO_H 

class FIFO : public PageReplacementAlgorithm { 
public: 
    FIFO(); 
    int selectFrame(PageTableEntry &p); 
private: 
    int entries; 
}; 

#endif 

MAIN.CPP

#include "Aging.cpp" 
#include "Clock.cpp" 
#include "FIFO.cpp" 
#include "MMU.cpp" 
#include "NRU.cpp" 
#include "Random.cpp" 
#include "SecondChance.cpp" 
+0

素晴らしい!あなたのソースはどこですか? (質問に含めてください)。 –

+0

ソースコードを投稿してください:) – pkthapa

+0

ありがとう、ただ投稿しました:) – Matrix21

答えて

0

なぜmain.cppにすべてのcppファイルを含めるのですか?私は彼らには同じインクルードが入っていると思いますよね?そこに警備員がいても、その警備員の前に追加しておくとおそらく問題の原因になります。 main.cppにはmain()関数だけでなく、クラスのヘッダをインポートすることもできます.cppを含める必要はありません。 、私はあなたが#include "(anything).cppを取り除く場合は、答えC++ #include guards

+1

これは古くから知られています。(想像を絶するほど)['Single Compilation Unit'](https://en.wikipedia.org/wiki/Single_Compilation_Unit) – StoryTeller

+0

ありがとう!!今コンパイル中ですが、@StoryTellerだけでなく、 "Single Compilation Unit"も読み上げます。 C++にはまだまだ新しいものです。 – Matrix21

+2

@StoryTellerブリリアント。以前これを聞いたことはありません!Matrix21あなたはおそらくより多くの通常のコードを構築する方法に固執するだろう –

0

を見てお勧めします

#ifndef PageReplacementAlgorithm_H 
#define PageReplacementAlgorithm_H 
#include "Global.h" 
using namespace std; 

... 
#endif 

はまた、あなたは(極端な安全のため)このように見えるように、あなたのヘッダファイルを変更することができます物事はもっとうまくいくはずです。プロジェクトをビルドするときや、コンパイラを実行するときなど。 g++ main.cpp foo.cpp、それはそれらの.cppファイルがビルドされ、あなたのプログラムにリンクされる時です。