【问题标题】:How do I keep my Qt C++ program from opening a console in Windows?如何防止我的 Qt C++ 程序在 Windows 中打开控制台?
【发布时间】:2012-01-05 03:34:11
【问题描述】:

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

问题是我的应用程序在启动时会打开一个控制台,并且像往常一样,关闭此控制台也会关闭应用程序。我想阻止应用程序打开控制台,以便对不需要任何调试信息等的人更友好。

【问题讨论】:

  • 其实应该不是默认打开控制台的。
  • 不是 100% 确定,所以只是一个评论,但很可能应该有一个 ADD_EXECUTABLE(exename ....),其中的点当然是其他参数。你能把它改成ADD_EXECUTABLE(exename [WIN32] ...)吗?
  • Bart,你应该回答这个问题,因为它是“CMake 推荐”的方式......另一种方法是使用“-mwindows”链接标志对它进行skyhisi 的方式。跨度>

标签: c++ windows qt console cmake


【解决方案1】:

默认情况下,与 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()

在 Windows 以外的平台上编译时,WIN32_EXECUTABLE 属性无效(参见CMAKE_WIN32_EXECUTABLE)。

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

【讨论】:

  • 我想 set_target_properties 也可以使用。
  • @mjwach,是的,set_target_properties() 可以说是在你必须在一个目标上设置多个属性时更方便,其中set_property(TARGET ...) 可以说会产生更统一的CMakeLists.txt - 尤其是在设置属性时在目标上。
【解决方案2】:

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

ADD_EXECUTABLE(exename ....)

当然,这些点是进一步的论点。将其更改为:

ADD_EXECUTABLE(exename [WIN32] ...)

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

或者,可以找到on the CMAKE website“如果给定WIN32,属性WIN32_EXECUTABLE将在创建的目标上设置。”当设置 WIN32_EXECUTABLE 时,它将是“Build an executable with a WinMain entry point on windows”。

【讨论】:

    【解决方案3】:

    我有同样的问题,但通过添加解决了它:

    #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

    【解决方案4】:

    要使用 Mingw 进行构建,请添加 CMake 命令:

    set_target_properties(target_name PROPERTIES LINK_FLAGS "-mwindows")
    

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

    【讨论】:

    • 我试过这个,但它似乎对我来说破坏了一些东西。如果我添加这一行,然后编译,它会说编译成功,没有任何东西输出到.exe文件。即使我在代码中加入了明显的语法错误,它仍然会告诉我构建成功。
    • @Neko:尝试删除 cmakecache.txt 然后构建。有时,当您编辑 cmakelists.txt 时,cmake 错误地认为不应该重建任何内容
    【解决方案5】:

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

    CMAKE_POLICY(SET CMP0020 NEW)
    

    添加它会自动为您处理一切。如果您不设置此策略,CMake 实际上应该输出警告,至少我是这样得知它的存在的。

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2013-07-21
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2017-02-26
      • 2013-12-01
      • 1970-01-01
      相关资源
      最近更新 更多