CMake Qt5无法为ui文件AUTOUIC生成头文件
Posted
技术标签:
【中文标题】CMake Qt5无法为ui文件AUTOUIC生成头文件【英文标题】:CMake Qt5 can't generate header file for ui file AUTOUIC 【发布时间】:2017-12-11 12:47:19 【问题描述】:我无法使用 cmake 3.5.2 和 Qt 5.9 为我的 ui 文件生成标题。
我的 CMakeFileLists.txt:
cmake_minimum_required(VERSION 3.5)
project( fc_app )
message( STATUS "Configuring project")
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
message( STATUS "search OpenCV")
find_package(
OpenCV
3.2.0
REQUIRED
)
message( STATUS "search Qt")
find_package(
Qt5
5.5.1
REQUIRED
Core
Gui
Widgets
Multimedia
)
message( STATUS "search Boost")
find_package(
Boost
1.58.0
REQUIRED
)
file( GLOB_RECURSE source_files src/* )
file( GLOB_RECURSE header_files include/* )
file( GLOB_RECURSE ui_files ui/* )
file( GLOB_RECURSE res_files res/* )
add_executable(
fc_app
$source_files
$header_files
$ui_files
)
target_link_libraries(
fc_app
$OpenCV_LIBS
Qt5::Widgets
Qt5::Multimedia
$Boost_LIBRARIES
)
当我在 root/build/ 目录中运行 cmake .. & make
时出现以下错误(在 make 中)。 ui文件是一个简单的QMainWindow,里面有2个按钮,所以我不明白为什么ui_mainwindow.h的生成失败了。我也尝试使用其他版本的 Qt5 Designer 重新制作 ui 文件。
File '/blablablabla/mainwindow.ui' is not valid
AUTOUIC: error: process for ui_mainwindow.h needed by
"/blablablabla/mainwindow.cpp"
failed:
File '/blablablabla/mainwindow.ui' is not valid
【问题讨论】:
【参考方案1】:CMake 和 QT for AUTOUIC 有一个怪癖。 claimed CMake 将自动扫描文件以查找 ui 文件包含,但如果 ui 包含位于源文件的第一行,它就不起作用。
所以如下设置:
CMakeLists.txt
:
project("proj")
set(CMAKE_PREFIX_PATH "$ENVQTDIR")
find_package(Qt5Core REQUIRED)
find_package(Qt5Widgets REQUIRED)
set(CMAKE_INCLUDE_CURRENT_DIR "YES")
set(CMAKE_AUTOMOC "YES")
set(CMAKE_AUTOUIC "YES")
add_executable("proj" MACOSX_BUNDLE main.cpp)
target_link_libraries("proj" Qt5::Core Qt5::Widgets)
form.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
</widget>
<resources/>
<connections/>
</ui>
使用main.cpp
编译将失败:
1. #include "ui_form.h"
2.
3. int main()
4.
$ cmake --build . Scanning dependencies of target proj_automoc [ 25%] Automatic moc and uic for target proj Generating moc compilation proj_automoc.cpp [ 25%] Built target proj_automoc Scanning dependencies of target proj [ 50%] Building CXX object CMakeFiles/proj.dir/main.cpp.o main.cpp:1:10: fatal error: 'ui_form.h' file not found #include "ui_form.h" ^ 1 error generated. make[2]: *** [CMakeFiles/proj.dir/main.cpp.o] Error 1 make[1]: *** [CMakeFiles/proj.dir/all] Error 2 make: *** [all] Error 2
但是,如果您的 ui 包含不在第一行:
1.
2. #include "ui_form.h"
3. int main()
4.
$ cmake --build . [ 25%] Automatic moc and uic for target proj Generating ui header ui_form.h [ 25%] Built target proj_automoc Scanning dependencies of target proj [ 50%] Building CXX object CMakeFiles/proj.dir/main.cpp.o [ 75%] Building CXX object CMakeFiles/proj.dir/proj_automoc.cpp.o [100%] Linking CXX executable proj.app/Contents/MacOS/proj [100%] Built target proj
UPD。 This regular expression用来扫描include是罪魁祸首:
this->UicRegExpInclude.compile("[\n][ \t]*#[ \t]*include[ \t]+"
"[\"<](([^ \">]+/)?ui_[^ \">/]+\\.h)[\">]");
它在最新版本 3.10.2 中仍然存在,但已在 3.11 中修复:
Uic_.RegExpInclude.compile("(^|\n)[ \t]*#[ \t]*include[ \t]+"
"[\"<](([^ \">]+/)?ui_[^ \">/]+\\.h)[\">]");
【讨论】:
【参考方案2】:我不知道这个问题是否与特定版本的 CMake 相关,但 a 有同样的问题并发布了如果您的 ui
文件有大写字母,例如 MuyWidget.ui
,那么您在 CMake 中会出现该错误.我的解决方案是将ui
文件命名为小写mywidget.ui
而不是MyWidget.ui
。
【讨论】:
注意:我用的是linux以上是关于CMake Qt5无法为ui文件AUTOUIC生成头文件的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Qt5/cmake 项目中加载 Qt 资源文件中指定的图像