qt5编译项目出现undefined reference to 'classname::staticmetaobject'

在qt项目开发中,编译时出现如下错误:

error:undefined reference to 'classname::staticmetaobject'
error:undefined reference to 'vtable for classname'

出现这个错误,应该是moc出现了问题。
Qt 将源代码交给标准 C++ 编译器,如 gcc 之前,需要事先将这些扩展的语法去除掉。完成这一操作的就是 moc。

moc 全称是 Meta-Object Compiler,也就是“元对象编译器”。Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。

google发现,出现这个错误一般有如下几种:

1.pro文件中HEADERS 未包含目标.h文件

2.cpp文件中使用宏 Q_OBJECT
这种情况下需要在文件结尾添加如下:

#include "classname.moc"

然后重新qmake ,重新编译项目

3.修改 Q_OBJECT 等宏之后,要运行 qmake 来使 moc 重新生成 makefile。

可是尝试了这些方法之后,问题依然存在(原本项目中不存在如上问题)。

经过检查发现,.h文件中使用了

//.h
#if defined(Q_OS_LINUX)
class name{
	Q_OBJECT
	...
}
#endif

删除#if defined()后,重新运行qmake,编译项目,问题消失。

可见moc进行预处理会忽略#if defined() 中的代码。

你可能感兴趣的:(QT)