CMake编译Qt5项目报错QMainWindow: No such file or directory如何解决?
问题1:找不到头文件的解决方法
编译报错的核心原因是:qtbasicapp_app_lib 编译 Application.cpp 时引入了 MainWindow.hpp,而该头文件依赖Qt头文件,但qtbasicapp_app_lib没有继承到Qt的头文件路径配置。
按以下步骤修正:
- 删除硬编码的Qt头文件路径
打开src/windows/main/CMakeLists.txt,删除target_include_directories配置中的/usr/include/x86_64-linux-gnu/qt5/QtWidgets行。Qt官方导入的Qt5::Widgets目标会自动携带正确的头文件路径,手动硬编码会导致跨平台失效。 - 补全库依赖传递
在src/app/CMakeLists.txt中添加依赖声明,让qtbasicapp_app_lib继承到Qt的配置:
target_link_libraries(${LIB_NAME} PUBLIC qtbasicapp_windows_main_lib)
不需要直接链接Qt5::Widgets,因为qtbasicapp_windows_main_lib已经用PUBLIC方式链接了Qt5::Widgets,依赖会自动传递。
问题2:undefined reference to 'vtable for MainWindow'的解决方法
该报错是Qt开发的典型问题:你在MainWindow类中用了Q_OBJECT宏,但CMake没有自动调用Qt的MOC编译器生成对应的元对象代码,导致虚函数表缺失。
按以下步骤修正:
- 开启Qt自动编译开关
在根目录CMakeLists.txt的find_package(Qt5 ...)配置附近,添加三行全局配置:
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON)
开启后CMake会自动扫描所有带Q_OBJECT的头文件,自动调用MOC生成对应代码并加入编译目标。
2. 适配OBJECT库的特殊情况(可选)
如果你使用的CMake版本低于3.16,对OBJECT库的AUTOMOC处理存在兼容问题,可以把qtbasicapp_windows_main_lib从OBJECT库改成STATIC库即可解决。
额外优化建议
- 不需要在子目录重复执行
find_package(Qt5),根目录执行一次后所有子目录都可以直接使用Qt5::Widgets目标 - 所有需要用到Qt头文件的目标,只要链接
Qt5::Widgets就会自动获得头文件路径,不要手动写任何Qt相关的硬编码路径
内容的提问来源于stack exchange,提问作者Kabuuz
相关产品推荐
相关产品推荐

