2016-10-28 12 views
-2

私は擬似シェルプログラムの作成を開始しましたが、すぐに問題になりました。 私のプロジェクトをコンパイルするとき、私はcmdの `vtableの」への未定義の参照を取得していますC++エラー未定義 `vtable for XXX 'への参照

Shell.h

#ifndef SHELL_H 
#define SHELL_H 
#include <iostream> 
#include <unistd.h> 
#include <stdio.h> 
#include <sys/wait.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <cstring> 


using namespace std; 

class Shell 
{ 
protected: 
char* cmd; 

public: 
Shell(): cmd(NULL){}; 
Shell(char* userInput): cmd(userInput){}; 
virtual bool execute() = 0; 
}; 

#endif 

Cmd.h

#ifndef CMD_H 
#define CMD_H 
#include <unistd.h> 
#include <iostream> 
#include <stdio.h> 
#include <sys/wait.h> 
#include <sys/types.h> 
#include <stdlib.h> 
#include <cstring> 
#include "Shell.h" 

using namespace std; 

class Cmd : public Shell 
{ 
public: 
Cmd(): Shell(NULL) {}; 
Cmd(char* userInput): Shell(userInput) {}; 
bool execute(); 
}; 

#endif 

Cmd.cpp

#include "Cmd.h" 



bool Cmd::execute() 
{ 
char * list[1000]; 
bool status = true; 
return status; 
} 

私はこれを研究し、私はそれが私のメイクファイルまたは私の仮想関数からであることがわかった 私の仮想関数は、エラーがあなたがクラスの最初の仮想メソッドへの参照が欠落していることを意味

Makefileの

COMPILE = g++ 
    FLAGS = -Werror -Wall -ansi 


all: 
mkdir -p ./bin 
    $(COMPILE) $(FLAGS) ./src/main.cpp -o ./bin/rshell 
main: 
    $(COMPILE) $(FLAGS) ./src/main.cpp 

Cmd: 
    $(COMPILE) $(FLAGS) ./src/Cmd.cpp 

Exit: 
    $(COMPILE) $(FLAGS) ./src/Exit.cpp 

Connector: 
    $(COMPILE) $(FLAGS) ./src/Connector.cpp 

And: 
    $(COMPILE) $(FLAGS) ./src/And.cpp 

Or: 
    $(COMPILE) $(FLAGS) ./src/Or.cpp 

Semi: 
    $(COMPILE) $(FLAGS) ./src/Semi.cpp 

clean: 
rm -rf ./bin 
+1

示されたメイクファイルは完全に壊れています。すべての翻訳単位を単一の実行可能ファイルにリンクするのではなく、個々の翻訳単位をスタンドアロンの実行可能ファイルとしてコンパイルしようとしています。 –

+0

すべてのファイルをコンパイルして* one *プログラムにリンクする必要があります。 – immibis

+0

どうすればいいですか?オンラインseadchingは、makefileを実装するための幅広いバリエーションを提供します。 – opera97

答えて

0

宣言されています。

問題は、あなたがmakefileをホーズしていることです。次のように解決の

一般的な形式は次のとおりです。

CXX=g++ -Werror -Wall -ansi -c 
LD=g++ 
OBJS=/src/main.o src/Cmd.o src/Exit.o src/Connector.o src/And.o src/Or.o src/Semi.o 

all: .PHONY 
     mkdir bin 
     $(LD) -o bin/rshell $(OBJS) 

%.o: %.cpp Shell.h Cmd.h 
     $(CXX) $(FLAGS) -o [email protected] $< 

ここで起こって物事のカップルがあります。

  1. OBJSの使用と多くのタイピングを保存するルール。
  2. 各.cppファイルを-cでコンパイルすると、あまりにも早くリンクしようとするのを避けることができます。
  3. 最後の手順としてリンクすると、何もコンパイルされません。
  4. .PHONYを使用すると、誰かがallというファイルを作成した場合にコンパイルが実行されることはありません。
+0

makefile以外のコードから、私の友人は同じレイアウトを持ち、makefileは正常に動作します。 – opera97

+0

あなたのmakefileはmain.cppだけをプログラムにコンパイルしようとしました。それは正しいことではありません。 – Joshua

+0

私の質問に答えてもらえませんか、誰も私に深い答えを与えてくれません – opera97

関連する問題