如何将CMake中的QtMain与Qt5链接?

Kla*_*aim 19 c++ qt cmake c++11 qt5

我将项目代码从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特定的方式来做它我找不到的Qt5文档.

您可以浏览文件历史记录以查看它如何与Qt4一起使用.

Fra*_*ser 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 )
Run Code Online (Sandbox Code Playgroud)

我还建议您删除两个link_libraries调用,因为它是一个已弃用的命令,我指定CMake版本2.8.9而不是仅仅2.8作为CMakeLists.txt顶部所需的最小值,因为这是必需的qt5_use_modules.


ste*_*ire 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/

  • http://www.cmake.org/cmake/help/git-master/manual/cmake-policies.7.html如果使用太旧版本的CMake构建cmake_minimum_required()命令,则会报告错误一个专案.它还将该CMake版本或更早版本中引入的所有策略设置为NEW行为. (2认同)

Ant*_*ane 5

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

target_link_libraries(<your_app> Qt5::WinMain)
Run Code Online (Sandbox Code Playgroud)

要么

target_link_libraries(<your_app> ${Qt5Core_QTMAIN_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

在您的应用程序的CMakeLists.txt中.两种语法都适合我.