如何让我的Qt c++程序在Windows中打开控制台?

How do I keep my Qt C++ program from opening a console in Windows?

本文关键字:Windows 控制台 程序 我的 Qt c++      更新时间:2023-10-16

我正在Qt Creator中制作应用程序,使用cmake和MinGW作为编译器。我已经看到这个问题被回答了其他人,但他们使用常规Qt项目与。pro文件,而我使用CMakeLists.txt文件。所以这些帖子对我没有任何帮助。

问题是我的应用程序在启动时打开了一个控制台,像往常一样,关闭这个控制台也会关闭应用程序。我想让应用程序不打开控制台,这样对于不需要任何调试信息之类的人来说,它更加用户友好。

默认情况下,与qmake相反,cmake在windows下使用启用的控制台窗口构建Qt应用程序(windows二进制文件可以使用不同的入口点-控制台窗口是其中之一)。

你可以通过在可执行文件上设置WIN32_EXECUTABLE cmake属性来禁用控制台窗口的出现。

这可以通过设置add_executable选项来实现,即

add_executable(myexe WIN32 ...)

或通过显式设置属性:

set_property(TARGET main PROPERTY WIN32_EXECUTABLE true)

当控制台窗口应该有条件地禁用时,使用set_property()是有用的,例如:

if(CMAKE_BUILD_TYPE STREQUAL "Release")
  set_property(TARGET main PROPERTY WIN32_EXECUTABLE true)
endif()

WIN32_EXECUTABLE属性在非windows平台上编译时不起作用(参见CMAKE_WIN32_EXECUTABLE)。

WIN32 cmake变量一样,WIN32_EXECUTABLE属性在编译win64可执行文件时也配置控制台窗口。

您很可能在CMakeLists.txt中有如下一行:

ADD_EXECUTABLE(exename ....)

,其中的点当然是进一步的参数。将其更改为:

ADD_EXECUTABLE(exename [WIN32] ...)

指定它是Win32应用程序而不是控制台应用程序。

或者,可以在CMAKE网站上找到"如果WIN32被赋予属性WIN32_EXECUTABLE将在创建的目标上设置。"当设置WIN32_EXECUTABLE时,它将"在windows上构建一个带有WinMain入口点的可执行文件"。

我也有同样的问题,但通过添加:

#CMakeLists.txt
# ... some text (like finding QT)
LINK_LIBRARIES(${QT_QTMAIN_LIBRARY})
# ... and then
ADD_EXECUTABLE(my_qt_project WIN32 ... )

如果我不使用LINK_LIBRARIES(${QT_QTMAIN_LIBRARY}),我得到错误:

error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup

这是一个老问题,但无论如何,有一个更好的解决方案比所有其他张贴在这里:

CMAKE_POLICY(SET CMP0020 NEW)

添加这个将自动为您处理一切。如果你没有设置这个策略,CMake实际上应该输出一个警告,至少我是这样知道它的存在的。

使用Mingw构建,添加CMake命令:

set_target_properties(target_name PROPERTIES LINK_FLAGS "-mwindows")

target_name替换为目标的名称(add_executable的第一个参数)