【问题标题】:CMake Qt5 can't generate header file for ui file AUTOUICCMake Qt5无法为ui文件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

【问题讨论】:

    标签: c++ cmake qt5


    【解决方案1】:

    CMake 和 QT for AUTOUIC 有一个怪癖。 claimed CMake 将自动扫描文件以查找 ui 文件包含,但如果 ui 包含位于源文件的第一行,它就不起作用。

    所以如下设置:

    CMakeLists.txt:

    project("proj")
    
    set(CMAKE_PREFIX_PATH "$ENV{QTDIR}")
    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
      猜你喜欢
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      • 2014-02-23
      • 2021-10-24
      • 1970-01-01
      相关资源
      最近更新 更多