能否为继承QObject的仅头文件类实现Automoc自动处理?
可以不用配套.cpp文件,让仅头文件的QObject类被AUTOMOC自动处理
你遇到的undefined reference to vtable错误,核心原因是Qt的moc工具没为你的HeaderOnly类生成必要的元对象代码,或者生成的代码没被链接到最终可执行文件里。当QObject子类只在头文件中定义时,CMake的AUTOMOC默认可能没自动识别并处理这个头文件,导致moc代码缺失。
下面给你两种无需额外.cpp文件的解决方案:
方案一:修改CMakeLists.txt,把头文件加入目标源列表
这是最简单的方法,不需要改代码。只需要把Header.h添加到add_executable的源文件参数里:
add_executable(test Main.cpp Header.h)
这样CMake会把Header.h纳入AUTOMOC的扫描范围,自动生成moc_Header.cpp并将其编译、链接到你的可执行文件中。
方案二:在头文件中条件包含moc生成的代码
如果你的头文件会被多个源文件包含,这个方法能避免重复定义问题。修改Header.h,在文件末尾的#endif之前加上这段代码:
#ifdef Q_MOC_RUN // moc工具运行时会定义这个宏,此时跳过包含,避免循环处理 #else #include "moc_Header.cpp" #endif
当你编译项目时,AUTOMOC会扫描Main.cpp里的Q_OBJECT宏,生成moc_Header.cpp;而正常编译源文件时,这段代码会把moc生成的代码包含进头文件,相当于直接在Main.cpp里编译了moc代码,同时Q_MOC_RUN宏的判断能避免moc工具自己处理时出现循环。
为什么原来加Header.cpp能解决问题?
本质上是因为那个cpp文件把moc生成的代码引入了编译流程,而上面的两种方法都是在不额外创建cpp文件的前提下,让moc代码被正确编译并链接。
选任意一种方法调整后,重新运行cmake ..和make,应该就能正常编译运行了。
内容的提问来源于stack exchange,提问作者Mikey A. Leonetti
相关产品推荐
相关产品推荐

