对虚表、构造函数和析构函数的未定义引用
Undefined reference to virtual table, Constructor and Destructor
我正在处理的一些同意多任务代码的构造函数和析构函数遇到了麻烦。我收到的错误是
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()
没有任何定义。你需要定义它。
仔细一想,我会给这个函数取一个更合适的名字。
优秀阅读:
"虚表"是一个未解析的外部表是什么意思?
相关文章:
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用