C ++错误未定义引用`vtable for XXX'

时间:2016-10-28 02:00:15

标签: c++ inheritance makefile

我已经开始编写一个模拟shell程序,但马上就出现了问题。 我得到一个未定义的引用`vtable for Cmd'在编译我的项目时

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 :(得分: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 $@ $<

这里发生了一些事情。

  1. 使用OBJS和规则来节省大量输入内容。
  2. 使用-c编译每个.cpp文件,以避免过早尝试链接。
  3. 链接作为最后一步并不编译任何内容。
  4. 使用.PHONY,如果有人制作了一个名为all的文件,编译就不会窒息。