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生成头文件的主要内容,如果未能解决你的问题,请参考以下文章

CMake学习笔记一

ui_* 文件不是 QT5.5 生成的

无法在 Qt5/cmake 项目中加载 Qt 资源文件中指定的图像

qt5的.ui文件在VS2010中无法编译问题

vs2015 qt5.8新添加文件时出现“无法找到源文件ui.xxx.h”

使用 cmake 的跨平台 Qt5 项目