【问题标题】:Combination cmake 2.8.11.2 with qt 5.1 won't create ui_xxx.h files将 cmake 2.8.11.2 与 qt 5.1 组合不会创建 ui_xxx.h 文件
【发布时间】:2013-08-07 11:26:14
【问题描述】:

我最近开始使用 cmake 来管理我的 qt 项目,主要是为了能够在 Visual Studio 2012 和 xcode 之间轻松切换。

现在我面临一个奇怪的问题(奇怪,因为我很确定这已经奏效了)。

问题在于 cmake(准确地说是 cmake-gui)不会创建 ui_xxx.h 文件(还有吗?)。我已经在互联网上搜索了解决方案,但似乎我是唯一有这个问题的人;)

为了简单起见并消除我个人的错误或愚蠢,我还尝试了此处找到的非常基本的设置:

https://github.com/euler0/mini-cmake-qt/blob/master/CMakeLists.txt

但仍然 - 没有 ui_xxx.h。

我在两台不同的(Windows 7 64 位)机器上对此进行了测试,结果相同。

正如我在这篇文章的主题中已经描述的,我使用的是 cmake 版本 2.8.11.2 和 qt 5.1。我将环境变量 QTDIR 设置为“c:\Qt\Qt5.1.0\5.1.0\msvc2010\”并将“%QTDIR%\bin”添加到 PATH。

使用上面链接中使用的 CMakeLists.txt 文件,我得到的唯一警告是“未设置策略 CMP0020”,可以通过在文件中添加“cmake_policy(SET CMP0020 OLD)”轻松关闭。

我错过了什么?

【问题讨论】:

  • 我猜UI文件是在构建路径的ui子目录中生成的。查看构建路径并尝试搜索文件所在的位置。
  • 您好 Pavel,感谢您的回复,但是......当您只有 3 个文件时,看到生成的文件并不难。该文件不存在,所以问题更像是:我是否忘记设置一些环境变量或者 cmake 中是否有一个选项会输出构建错误,例如“无法为 创建 ui_xxx.h 文件”
  • 只有在使用VS时才会出现这种情况吗?您是否查看过 Qt Visual Studio 插件?
  • 刚刚用 MinGW 试了一下。结果相同。

标签: qt cmake


【解决方案1】:

真的没有人有这个问题吗?

我试图进一步调试这个问题,所以我修改了 Qt5WidgetsMacros.cmake 以输出它使用的每个变量。我的 Qt5WidgetsMacros.cmake 现在看起来像这样:

function(PRINT_LIST caption items)
    set(i 1)
    foreach (item ${items})
        message(${caption} " " ${i} ": " ${item})
        math(EXPR i "${i}+1")
    endforeach()
endfunction()

# qt5_wrap_ui(outfiles inputfile ... )

function(QT5_WRAP_UI outfiles )
    set(options)
    set(oneValueArgs)
    set(multiValueArgs OPTIONS)

    cmake_parse_arguments(_WRAP_UI "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

    set(ui_files ${_WRAP_UI_UNPARSED_ARGUMENTS})
    set(ui_options ${_WRAP_UI_OPTIONS})

    PRINT_LIST("Option" "${options}")
    PRINT_LIST("oneValueArg" "${oneValueArgs}")
    PRINT_LIST("multiValueArg" "${multiValueArgs}")
    PRINT_LIST("ARGN" "${ARGN}")
    PRINT_LIST("UI file" "${ui_files}")
    PRINT_LIST("UI option" "${ui_options}")

    foreach(it ${ui_files})
        get_filename_component(outfile ${it} NAME_WE)
        message("outfile: " ${outfile})
        get_filename_component(infile ${it} ABSOLUTE)
        message("infile: " ${infile})
        set(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h)
        message("outfile: " ${outfile})
        message("Qt5Widgets_UIC_EXECUTABLE: " ${Qt5Widgets_UIC_EXECUTABLE})
        add_custom_command(OUTPUT ${outfile}
            COMMAND ${Qt5Widgets_UIC_EXECUTABLE}
            ARGS ${ui_options} -o ${outfile} ${infile}
            MAIN_DEPENDENCY ${infile} VERBATIM)
        list(APPEND ${outfiles} ${outfile})
    endforeach()

    PRINT_LIST("Outfile" "${outfiles}")
    set(${outfiles} ${${outfiles}} PARENT_SCOPE)
    PRINT_LIST("Outfile" "${outfiles}")
endfunction()

CMakeLists.txt 文件的输出来自我原始帖子中的链接 - https://github.com/euler0/mini-cmake-qt/blob/master/CMakeLists.txt - 是:

multiValueArg 1: OPTIONS
ARGN 1: ./ui/mainwindow.ui
UI file 1: ./ui/mainwindow.ui
outfile: mainwindow
infile: C:/t/test/ui/mainwindow.ui
outfile: C:/t/test/out/ui_mainwindow.h
Qt5Widgets_UIC_EXECUTABLE: Qt5::uic
Outfile 1: UI_HEADERS
Outfile 1: UI_HEADERS

我会说看起来不错,但仍然:没有 ui_mainwindow.h

为了完整起见,这里是我的qt-settings:

QT_SYSROOT:
QT_INSTALL_PREFIX:C:\Qt\Qt5.1.0\\5.1.0\msvc2012
QT_INSTALL_ARCHDATA:C:\Qt\Qt5.1.0\\5.1.0\msvc2012
QT_INSTALL_DATA:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\
QT_INSTALL_DOCS:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\doc
QT_INSTALL_HEADERS:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\include
QT_INSTALL_LIBS:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\lib
QT_INSTALL_LIBEXECS:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\libexec
QT_INSTALL_BINS:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\bin
QT_INSTALL_TESTS:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\tests
QT_INSTALL_PLUGINS:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\plugins
QT_INSTALL_IMPORTS:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\imports
QT_INSTALL_QML:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\qml
QT_INSTALL_TRANSLATIONS:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\translations
QT_INSTALL_CONFIGURATION:
QT_INSTALL_EXAMPLES:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\examples
QT_INSTALL_DEMOS:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\examples
QT_HOST_PREFIX:C:\Qt\Qt5.1.0\\5.1.0\msvc2012
QT_HOST_DATA:C:\Qt\Qt5.1.0\\5.1.0\msvc2012
QT_HOST_BINS:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\bin
QT_HOST_LIBS:C:\Qt\Qt5.1.0\\5.1.0\msvc2012\lib
QMAKE_SPEC:win32-msvc2012
QMAKE_XSPEC:win32-msvc2012
QMAKE_VERSION:3.0
QT_VERSION:5.1.0

有什么想法吗?

【讨论】:

  • 对不起,伙计们,我的错 :( 令人尴尬,但仍然:这是我对它应该如何工作的误解导致了我的问题。我认为 cmake 会调用 uic.exe(就像它调用 moc.exe 一样)对我来说,并会立即创建 ui_xxx.h 文件。实际上,它只是在 makefile 中的项目中引入了一个自定义构建步骤(或者在我的情况下,在 VS2012 项目中)。所以只有当我 建立我的项目。嗯...也许我的错误仍然可以对其他人有任何帮助。
  • 发生了什么?每当我调用我的 makefile 来构建我的项目时,我的 ui_xxx.h 标头都会说它们丢失了?
猜你喜欢
  • 2013-09-11
  • 2022-08-07
  • 2017-02-15
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多