CMake和QT5 - QT5_WRAP_UI没有生成ui头文件

14

我有一个简单的 CMakeLists.txt,它看起来像这样:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

PROJECT(calculator)

FIND_PACKAGE(Qt5Core)
FIND_PACKAGE(Qt5Gui)
FIND_PACKAGE(Qt5Widgets)

SET(CMAKE_AUTOMOC ON)
SET(CMAKE_INCLUDE_CURRENT_DIR ON)

SET(calculator_SOURCES main.cpp mainwindow.cpp)
SET(calculator_HEADERS mainwindow.h)
SET(calculator_FORMS mainwindow.ui)

QT5_WRAP_CPP(calculator_HEADERS_MOC ${calculator_HEADERS})
QT5_WRAP_UI(calculator_FORMS_HEADERS ${calculator_FORMS})

ADD_LIBRARY(calculator_CONFIG ${calculator_HEADERS_MOC} ${calculator_FORMS_HEADERS})
QT5_USE_MODULES(calculator_CONFIG Widgets)

ADD_EXECUTABLE(calculator ${calculator_SOURCES} ${calculator_CONFIG})
QT5_USE_MODULES(calculator Core Gui Widgets)

当我尝试使用cmake -G "Unix Makefiles"构建项目,然后使用make时,控制台显示ui_mainwindow.h未找到。问题出在哪里?是我的cmake文件有问题吗?


完整的错误输出:

[ 22%] Building CXX object CMakeFiles/calculator.dir/mainwindow.cpp.o
/home/centurion/Code/cpp/calculator/mainwindow.cpp:2:27: fatal error: ui_mainwindow.h: No such file or directory
 #include "ui_mainwindow.h"
                           ^
compilation terminated.
make[2]: *** [CMakeFiles/calculator.dir/mainwindow.cpp.o] Error 1
make[1]: *** [CMakeFiles/calculator.dir/all] Error 2
make: *** [all] Error 2
3个回答

20

我遇到了与cmake 3.2.2相同的问题。尝试使用

SET(CMAKE_AUTOUIC ON)  

如果没有生成UI文件。也许默认行为最近发生了变化?


我在3.2.2中遇到了同样的问题。SET(CMAKE_AUTOUIC ON)解决了它! - Zelid
这也解决了我的问题。如果官方文档中的教程能够修复就更好了。 - krcools

2
  1. 使用小写的CMake命令,这已经是多年来的惯例。

  2. 为什么要同时使用AUTOMOCqt5_wrap_cppAUTOMOC是用来替换宏的。详见http://www.cmake.org/cmake/help/v3.0/manual/cmake-qt.7.html#automoc

  3. 如果使用CMake 2.8.11或更高版本,则不需要使用qt5_use_modules。我写了这个补丁是为了在CMake 2.8.11发布之前暂时解决问题。命令target_link_libraries可以更好地、更通用地替代qt5_use_modules。详见http://doc-snapshot.qt-project.org/qt5-5.3/cmake-manual.html

  4. 该库没有自己的源代码,也没有被使用。你在这里显然“做错了”。将${calculator_FORMS_HEADERS}变量的使用移到可执行文件的源代码中。然后,在解决第2点之后,删除该库。


2
不要问我,我是通过教程来到这一步的。感谢你的回答。 - Kenny Worden
18
这个答案听起来有点傲慢;我希望我只是看错了(我没有点踩)。CMake本身非常难以理解,而特殊的Qt魔法并没有让它变得更容易。 - weberc2
1
我本来是在寻找其他东西时偶然看到这个问题,但第二个问题引起了我的兴趣,所以我从我的CMakeLists.txt中删除了qt5_wrap_cpp,结果出现了未解决的外部符号错误。我又把它加回去了,现在一切正常。我已经将CMAKE_AUTOMOC设置为ON。我最终删除了automoc设置,因为它似乎没有任何作用。 - Chuck Claunch
第三个文档链接已失效。 - Stefan Fabian
我来到这里是因为遇到了类似的问题,但是没有使用任何“不合理”的东西,所以我一定找到了比那个可怜的人更近期的示例/教程。作为一个新手CMake,但不是现代软件和构建过程和工具的新手,这并不容易理解。除此之外,我们都知道没有人会清理过时的“指南”等网络内容。 - Thomas Carlisle

1
我在Mac OS X上遇到了相同的问题。Ui表单头文件未生成。
我通过使用QtDesigner手动生成.h文件来解决我的问题。当对ui表单进行更改时,头文件会被正确生成。
注意:如果我添加其他ui表单,则这些其他ui的头文件将自动生成,无需手动生成头文件。
编辑:仅在第一次构建时生成头文件,如果没有在cpp代码中使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接