g++(MinGW-w64)编译Qt时嵌套头文件路径无法识别问题咨询
Qt头文件的嵌套引用统一以Qt安装目录下的include根目录为基准写相对路径,比如你看到的#include <QtWidgets/qtwidgetsglobal.h>,要求编译器的头文件搜索路径下存在QtWidgets/qtwidgetsglobal.h这层子路径。
你当前只把include/QtWidgets子目录加入了搜索路径,编译器在这个路径下查找QtWidgets/qtwidgetsglobal.h,实际查找的目标路径是include/QtWidgets/QtWidgets/qtwidgetsglobal.h,和文件实际存放位置不符,自然会报找不到文件的错误。
优先推荐(新手适用)
不要手动拼接g++编译命令,Qt的编译流程包含moc元对象预处理、多模块依赖链接、平台参数适配等大量环节,手动写命令几乎必然踩坑,直接用Qt官方构建工具自动生成编译参数即可:
- 在项目根目录新建后缀为
.pro的qmake配置文件,写入以下内容:
QT += core gui widgets SOURCES += main.cpp TARGET = your_project_name
- 打开对应MinGW版本的Qt命令行终端(不要用系统自带cmd,会缺环境变量),进入项目目录依次执行:
qmake mingw32-make
执行完成后会自动生成可执行文件,不需要手动配置任何头文件、库路径。
额外提醒:你当前用的是Qt Design Studio自带的精简版Qt,这个版本是给QML界面预览设计用的,大概率缺失C++ Widgets项目编译需要的完整工具链(moc、链接库等),如果执行上述命令报错,建议单独安装完整版的MinGW架构Qt安装包。
手动写g++命令的修正方法(不推荐)
如果一定要手动写编译命令,首先要修正头文件搜索路径参数:
- 必须把Qt的
include根目录加入搜索路径,才能正确解析所有带模块前缀的嵌套include引用 - 同时需要把你用到的Qt模块对应的子目录也加入搜索路径,才能支持
#include <QApplication>这种不带模块前缀的写法
修正后编译阶段的命令示例:
g++ -c main.cpp \ -ID:/QT515/Tools/QtDesignStudio/qt5_design_studio_reduced_version/include \ -ID:/QT515/Tools/QtDesignStudio/qt5_design_studio_reduced_version/include/QtCore \ -ID:/QT515/Tools/QtDesignStudio/qt5_design_studio_reduced_version/include/QtGui \ -ID:/QT515/Tools/QtDesignStudio/qt5_design_studio_reduced_version/include/QtWidgets
注意这只是解决了当前头文件找不到的问题,后续你还需要手动运行moc处理带Q_OBJECT宏的头文件、添加-L参数指定Qt库目录、添加-l参数链接QtCore/QtGui/QtWidgets等依赖库、添加平台相关的编译宏定义,步骤非常繁琐,新手不建议尝试。
内容的提问来源于stack exchange,提问作者Adrien Wantiez

