私は擬似シェルプログラムの作成を開始しましたが、すぐに問題になりました。 私のプロジェクトをコンパイルするとき、私は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
示されたメイクファイルは完全に壊れています。すべての翻訳単位を単一の実行可能ファイルにリンクするのではなく、個々の翻訳単位をスタンドアロンの実行可能ファイルとしてコンパイルしようとしています。 –
すべてのファイルをコンパイルして* one *プログラムにリンクする必要があります。 – immibis
どうすればいいですか?オンラインseadchingは、makefileを実装するための幅広いバリエーションを提供します。 – opera97