20

我将我的项目代码从 Qt4 升级到 Qt5。它使用 CMake。除了一行与 Qt 相关的 Cmake 命令外,转换很顺利。我在当前文档中找不到,例如

如何从 CMake(使用 Qt5)与 QtMain 链接?

这是转换我的项目的唯一缺失位。有人可以向我指出一个解释这一点的文档或解释如何用 Qt5 做到这一点吗?我的 Qt4 代码工作正常,但我找不到 Qt5 的 Cmake 宏。

编辑>这是我目前拥有的 CMake 文件:https ://bitbucket.org/klaim/aos_qt5/src/593c195c4c6889f6968d68fca018ef425783a063/tools/aosdesigner/CMakeLists.txt?at=wip_qt5

我相信,所有 qt5 必要的 CMake 宏都已正确设置,唯一不起作用的是链接到 QtMain 什么都不做,正如预期的那样,因为应该有一种我在Qt5 文档。

您可以浏览文件历史记录以查看它是如何与 Qt4 一起工作的。

4

3 回答 3

14

从您链接到的Qt 文档中,您似乎可以找到 Qt5Core 而不是 Qt5Widgets。这将创建一个名为Qt5::WinMain. 来自Qt 文档

为每个 Qt 模块创建导入的目标。这意味着Qt5<Module>_LIBRARIES包含导入目标的名称,而不是库的路径。
...
Qt 5 中的每个模块都有一个具有命名约定的库目标Qt5::<Module>

find_package( Qt5Widgets REQUIRED )
find_package( Qt5Core REQUIRED )
...
add_executable( aosdesigner WIN32 ${AOSDESIGNER_ALL_FILES} )
target_link_libraries( aosdesigner
    ${Boost_LIBRARIES}
    utilcpp
    aoslcpp
    Qt5::WinMain  # <-- New target available via find_package ( Qt5Core )
)

qt5_use_modules( aosdesigner Widgets )

我还建议您删除您的两个link_libraries调用,因为它是一个已弃用的命令,并且我会在 CMakeLists.txt 顶部指定 CMake 版本 2.8.9 而不仅仅是 2.8 作为最低要求,因为这是qt5_use_modules.

于 2013-01-04T22:52:16.090 回答
7

从 CMake 2.8.11 和 Qt 5.1 开始,如果您在 add_executable 调用中指定 WIN32 或设置 WIN32_EXECUTABLE 目标属性,则链接到 Qt5::WinMain 是自动/隐式的。

演示文稿在

https://devdays.kdab.com/wp-content/uploads/2012/cmake.pdf

有视频在

http://www.youtube.com/watch?feature=player_detailpage&v=GJ0kMsLbk6Q#t=751

描述了使其成为 CMake 2.8.11 的功能。

有关使用 Qt 的 CMake 的更多信息,请参见

http://www.kdab.com/modern-cmake-with-qt-and-boost/

于 2013-11-18T12:37:33.647 回答
5

编辑:感谢 Archi 评论(见下文),只需添加

target_link_libraries(<your_app> Qt5::WinMain)

或者

target_link_libraries(<your_app> ${Qt5Core_QTMAIN_LIBRARIES})

在您的应用程序的 CMakeLists.txt 中。两种语法都对我有用。

于 2013-01-04T20:07:28.513 回答