VS编译报错无法打开源文件 ui_xxx.h,解决方法
一、问题现象
一打开vs就报错,没有生成ui_mainwindow.h,经查看没有生成out目录

二、原因分析
ui 文件未添加到可执行文件的源列表,只添加了cpp文件
虽然 AUTOUIC 开启,但 CMake 需要知道哪些 .ui 文件属于当前目标,才会为其调用 uic
三、解决方案
方案1
将 .ui 文件也加入 add_executable

方案2
无需将.ui 文件加入源文件列表,改用全局变量,在顶层 CMakeLists.txt 中,
set(CMAKE_AUTOUIC ON) 必须在 project() 命令之后,且在创建任何目标(add_executable / add_library)之前。

或者使用 Qt6 推荐的:qt_standard_project_setup(),Qt版本>=6.3
这样所有目标自动开启,且无需将 .ui 文件加入源列表。
qt_standard_project_setup()必须放在find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)之后,add_executable(...)之前

qt_standard_project_setup() 这个函数会自动设置 CMAKE_AUTOMOC、CMAKE_AUTOUIC、CMAKE_AUTORCC 为 ON(以及其他标准设置)。因此所有子目录都自动启用了这两个功能。
CMAKE_AUTOUIC 不需要显式添加 .ui 文件到源列表
当 CMAKE_AUTOUIC 启用时,CMake 会扫描目标的所有源文件(包括 .cpp 和 .h),查找 #include "ui_*.h" 这样的预处理指令。一旦发现,CMake 会自动在源文件所在目录(以及 CMAKE_CURRENT_SOURCE_DIR)中查找对应的 .ui 文件(例如 #include "ui_a.h" 会查找 a.ui),然后调用 uic 工具生成 ui_*.h 头文件。
不需要将 .ui 文件显式添加到 add_library 或 add_executable 的源列表中。
只要 .ui 文件和包含 #include "ui_*.h" 的 .cpp 文件位于同一目录(或子目录,且能被 CMake 找到),CMAKE_AUTOUIC 就会自动处理。
四、AUTOUIC ON 和 CMAKE_AUTOUIC ON 有什么区别?
1、作用范围
| 设置 | 作用域 | 类型 | 生效时机 |
| CMAKE_AUTOUIC | 全局(整个项目) | CMake 变量(通常为缓存变量) | 在 project() 之后设置,影响所有后续定义的目标 |
| AUTOUIC | 局部(单个目标) | 目标属性 | 仅影响调用 set_target_properties 时指定的那个目标 |
目标属性 AUTOUIC 的优先级高于全局变量 CMAKE_AUTOUIC
2、行为差异
全局 CMAKE_AUTOUIC ON
不需要将 .ui 文件显式添加到目标源列表。CMake 会扫描源文件中的 #include "ui_*.h",并在源文件所在目录自动查找对应的 .ui 文件并处理。
仅目标属性 AUTOUIC ON
需要将 .ui 文件显式添加到目标源列表。CMake 要求将 .ui 文件明确列在 add_executable 或 add_library 的源文件列表中,否则不会生成 ui_*.h
3、示例对比
全局方式(推荐,简洁)
cmake_minimum_required(VERSION 3.12)
project(MyApp)
set(CMAKE_AUTOUIC ON) # 全局开启
add_executable(myapp main.cpp) # 不需要列出 .ui 文件,CMake 会扫描 #include "ui_*.h" 自动处理
目标属性方式
cmake_minimum_required(VERSION 3.12)
project(MyApp)
add_executable(myapp main.cpp mainwindow.ui) # 必须显式添加 .ui 文件
set_target_properties(myapp PROPERTIES AUTOUIC ON)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)