Qt使用CMake构建移动头文件出现undefined reference to vtable错误如何解决
问题根因
你的CMake配置中扫描源文件时仅匹配了.hpp后缀的头文件,但项目里的Qt类头文件(loginWindow.h、mainWindow.h等)都是.h后缀,这些文件没有被加入到babel_client目标的源文件列表中。CMake的AUTOMOC默认仅会对加入目标的源文件、以及源文件同目录下关联的头文件进行扫描,生成带Q_OBJECT宏的类的moc代码。头文件和源文件分离目录后,AUTOMOC无法自动找到对应头文件,漏生成moc代码,就会出现vtable未定义的链接错误。同目录下能正常编译正是因为AUTOMOC可以直接找到同路径下的头文件。
解决步骤
- 修改CMake源文件扫描规则,补充.h后缀和子目录ui文件匹配
修改CMakeLists.txt中的源文件扫描部分:
# 客户端源文件扫描规则修改 file( GLOB_RECURSE SOURCES_CLIENT ${PROJECT_SOURCE_DIR}/src/*.cpp ${PROJECT_SOURCE_DIR}/src/client/*.cpp ${PROJECT_SOURCE_DIR}/include/client/*.hpp ${PROJECT_SOURCE_DIR}/include/client/*.h # 新增.h后缀匹配 ${PROJECT_SOURCE_DIR}/include/client/**/*.ui # 匹配views子目录下的ui文件 ${PROJECT_SOURCE_DIR}/resources.qrc ) # 公共源文件扫描规则修改 file( GLOB_RECURSE SOURCES_COMMON ${PROJECT_SOURCE_DIR}/src/common/*.cpp ${PROJECT_SOURCE_DIR}/include/common/*.hpp ${PROJECT_SOURCE_DIR}/include/common/*.h # 新增.h后缀匹配 )
建议删除
include/client/views下手动生成的ui_xxx.h文件,让CMake的AUTOUIC自动生成对应头文件到构建目录,避免版本不匹配冲突。
- 可选补充:显式指定AUTOMOC扫描目录
在set(CMAKE_AUTOMOC ON)配置下方添加如下代码,确保AUTOMOC能覆盖到头文件目录:
set(CMAKE_AUTOMOC_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/include/client ${PROJECT_SOURCE_DIR}/include/common )
- 重新构建项目
清空旧的构建目录缓存后重新执行构建:
rm -rf build/* cd build cmake .. make -j$(nproc)
内容的提问来源于stack exchange,提问作者Alvaro
相关产品推荐
相关产品推荐

