对虚表、构造函数和析构函数的未定义引用

Undefined reference to virtual table, Constructor and Destructor

本文关键字:未定义 引用 析构函数 虚表 构造函数      更新时间:2023-10-16

我正在处理的一些同意多任务代码的构造函数和析构函数遇到了麻烦。我收到的错误是

task.o: In function `$_4Task':
/home/luke/project/task.cc(.text+0x57): undefined reference to `Task virtual table'
task.o: In function `_4TaskUi':
/home/luke/project/task.cc(.text+0x5): undefined reference to `Task virtual table'

从对象文件来看,_4Task和_4TaskUi的解引用名称似乎分别是我的Task析构函数和构造函数。我似乎不能弄清楚为什么我的编译器告诉我,我没有引用虚拟表。任何帮助都将非常感激,我在ubuntu 12.10上使用GCC

下面是我的头文件
#ifndef TASK
#define TASK
#include "stddef.h"
#include "nocopy.h"
class Task: private NoCopy
{
    void** stack;           //Base of stack
    void** sp;              //saved sp when not running
    static Task* current;               //Point to running task
    static void start();                //calls task::main
    static void dispatch(Task* t);      //switch context to task t
    virtual void main();
    friend class TaskList;
protected:
    void fork();            //start task
public:
    Task(size_t stackSize);
    virtual ~Task();
    static Task* const getCurrent()
    {
        return current;
    }
    static void yield();
};
 #endif

,下面是我的CPP文件

#include "task.h"
Task initialTask(0);                //initial code before 
                             // set up stack in crt0.s
Task* Task::current = &initialTask;         //note first running task
TaskList readyList;
Task::Task(size_t stackSize)
:stack(new (void*)[stackSize/sizeof(void*)]),
 sp(&stack[stackSize/sizeof(void*)])
{                               //set up task stack
    if(stackSize)
    {
        *--sp = 0;      //for debugger
        *--sp = 0;      //terminate frame chain
        *--sp = &start; //point to first code
    }
}
Task::~Task()
{
    delete[](stack);
}
//Contec Switching
register void** spreg asm("s");     //can refer to hc12 SP as spreg
void Task::dispatch(Task* task)
{
    current -> sp = spreg;
    current = task;
    spreg = current -> sp;
}//Dispatch is called by one task but is returned by another
void Task::fork()       //call in ctor of all task
{
    TaskList::Node node(&readyList);    //Make caller go from "running"->"ready"
    dispatch(this);                 //Start new task
}
void Task::start()
{
    current -> main();
    TaskList forever;       //Wait Task
    forever.enqueue();      //Wait forever  
}

EDIT我弄明白了,因为每个人都说main在task.h或task中没有定义。这取决于任务,所以main的默认定义是

virtual void main(){};  

您需要为类中的所有virtual函数提供定义。只有纯虚函数可以不带定义而存在。您所展示的代码对函数Task::main()没有任何定义。你需要定义它。
仔细一想,我会给这个函数取一个更合适的名字。


优秀阅读:

"虚表"是一个未解析的外部表是什么意思?