【问题标题】:Why does my Qt 4.5 app open a console window under Windows?为什么我的 Qt 4.5 应用程序在 Windows 下打开控制台窗口?
【发布时间】:2010-10-20 02:34:15
【问题描述】:

我一直在使用 Linux 下的 Qt Creator 4.5。我的应用程序在 Linux 下构建得很好,但如果我在 Windows 中构建,应用程序总是在启动时打开一个控制台窗口。

我可以阻止它这样做吗?

我正在使用默认的 MinGW 设置进行构建,也许这是相关的。如果需要,我可以使用 Visual Studio 构建,但我想先了解发生了什么......

编辑:我刚刚在 Windows 下使用 Qt Creator 创建了一个简单的测试 GUI 应用程序,它没有表现出这种行为。由于在 linux 下创建项目的方式导致了这种行为,或者我的应用程序执行了某些操作导致控制台窗口出现。当我诊断它时会发布详细信息,以防它帮助其他人。

【问题讨论】:

    标签: windows qt console mingw qt-creator


    【解决方案1】:

    您需要确保提供了 -mwindows 开关。

    编辑:

    或者,您可以进入您的 makefile 并将其添加到您的链接器标志中:

    -Wl,-subsystem,windows
    

    【讨论】:

    • 我可以在 Qt Creator 中设置吗?
    【解决方案2】:

    听起来您的链接器设置是为控制台应用程序设置的。您可以尝试将链接器设置为使用 /subsystem:windows 选项。控制台应用程序的选项是 /subsystem:console。如果您在 Visual Studio 中构建项目,请创建一个 Win32 项目。不要创建 Win32 控制台应用程序。 Visual Studio 下用于设置子系统的选项位于 Project Settings->Linker->System->SubSystem 下。选择 Windows(/subsystem:windows)。

    我研究了如何使用 MinGW/gcc 执行此操作。 gcc 的在线文档显示了 Windows 目标的不同选项。就像其他人所说的那样,您正在寻找的选项是 -mwindows。选项 -mwindows 创建一个窗口应用程序。您当前的设置似乎是 -mconsole。选项 -mconsole 生成一个控制台应用程序。这是一个链接器选项。我对 Qt Creator 不熟悉,但我猜它有类似的方式来查看 Visual Studio 的项目设置。

    【讨论】:

    • 这些选项适用于 Microsoft 链接器。
    • 是的,我想了解为什么使用 Mingw 会发生这种情况。
    【解决方案3】:

    默认情况下,链接器假定您需要一个控制台应用程序。

    解决方法是将“-mwindows”添加到编译器的参数列表中,这也会在不可见的情况下添加所需的库(-lkernel32、-lgdi32 等)。您可能需要从 main() 更改为 WinMain() 作为入口点。

    RE:您的编辑: Qt 构建系统使用“spec”文件添加变量,您可以在 $QTDIR/qt/mkspecs 中找到它们。当您在 QCreator 中创建新的 Windows 应用程序时,它会将默认规范设置为“win32-g++”,这会自动设置正确的变量(Windows 应用程序、链接器标志等)。

    当您在 Linux 下创建项目时,它使用了另一个规范,这导致了您的问题。您可以在“yourproject.pro.user”文件中查看当前规范。

    【讨论】:

    • 好吧,我对 Qt 不是很熟悉。 Windows 中的 GUI 应用程序需要 WinMain,因此框架可能自己实现 WinMain() 并在幕后调用您的 main()。不过,帖子的其余部分仍然存在。
    【解决方案4】:

    确保您的 .pro 文件没有将 console 添加到变量 CONFIG。您可以通过添加来做到这一点

    CONFIG -= console
    

    位于 .pro 文件末尾的某个位置。如果CONFIG 包含console,每次启动程序时都会弹出一个窗口,打印调试输出时也会用到。因此,在调试程序时添加console 会很有用。否则,您需要使用DebugView 之类的工具来显示qDebug() 调用的输出。

    【讨论】:

      【解决方案5】:

      简短的回答是包含 Qt testlib 会导致控制台出现。删除它使它消失。

      进一步说明,如果您的 .pro 文件将 testlib 添加到 QT,例如

      QT += sql \
          webkit \
          network \
          testlib
      

      那么最后的链接步骤是用这样的一行来执行的

      g++ -enable-stdcall-fixup 
         -Wl,-enable-auto-import 
         -Wl,-enable-runtime-pseudo-reloc 
         -mthreads 
         -Wl 
         -Wl,-subsystem,console 
         -o debug\MyApp.exe object_script.MyApp.Debug  
         -L"c:\Qt\2009.01\qt\lib"  
         -lglu32 -lgdi32 -luser32 -lQtWebKitd4 -lQtTestd4 
         -lQtSqld4 -lQtGuid4 -lQtNetworkd4 -lQtCored
      

      我们已经使用控制台子系统了!我认为使用 testlib 会强制发生这种情况,以便测试输出有去处。

      如果我们现在编辑 .pro 文件并删除对 testlib 的引用并重新构建,我们会得到这样的链接步骤

      g++ -enable-stdcall-fixup 
         -Wl,-enable-auto-import 
         -Wl,-enable-runtime-pseudo-reloc 
         -mthreads 
         -Wl 
         -Wl,-subsystem,windows 
         -o debug\Ammotin.exe object_script.Ammotin.Debug  
         -L"c:\Qt\2009.01\qt\lib" 
         -lglu32 -lgdi32 -luser32 -lmingw32 -lqtmaind -lQtWebKitd4 
         -lQtSqld4  -lQtGuid4 -lQtNetworkd4 -lQtCored4
      

      耶!子系统是窗口,不再是控制台窗口。

      【讨论】:

      • 您好,我的 .pro 中没有testlib,我也有同样的问题
      • 此标志在 Qt 5.7 QT.testlib.CONFIG -= console 中有效,但此 CONFIG -= console 无效。
      【解决方案6】:

      Qt/2009.05/qt/mkspecs/win32-g++
      编辑文件 qmake.conf
      修改线路
      QMAKE_LFLAGS_CONSOLE = -Wl,-子系统,控制台

      QMAKE_LFLAGS_CONSOLE = -Wl,-子系统,windows

      并修改您的 ???.pro 文件(例如添加新行或空格)
      和编译
      它工作正常

      【讨论】:

        【解决方案7】:

        我使用 cmake 而不是 qmake。我使用了 set(CMAKE_CXX_FLAGS "-mwindows") 好像 QMAKE_CXXFLAGS +=-mwindows 在你的 .pro 文件中也会这样做。

        【讨论】:

        • 这适用于 gcc 工具链,但是使用 MSVC 编译器呢? (它说“未知选项 -mwindows”)。
        【解决方案8】:

        我认为这不是这个特定答案的解决方案(除了 4 年后), 但我认为登陆这个线程的很多人都会寻找这个设置:

        Projects > Build and Run > Run Settings > Run > [x] 在终端中运行

        取消选择它并从 QtCreator 运行您的 GUI,而无需额外的终端窗口。然后终端输出将嵌入到 IDE 中。

        【讨论】:

        • 谢谢,这是为我解决的问题。
        • 很高兴它帮助了某人:)
        • 正是我所需要的。谢谢。
        【解决方案9】:

        转到:Projects --> Run 并取消选中 Run in terminal 复选框

        【讨论】:

          【解决方案10】:

          对于在 Windows 下使用 CMake 遇到此问题的用户(请参阅 Amoo's comment),这里有一个解决方案 here

          简而言之,您需要将WIN32 添加到您的add_executable() 语句中:

          add_executable(GuiApplication WIN32 src/main.cpp)
          

          有关更多详细信息,请参阅 add_executableWIN32_EXECUTABLE 上的 CMake 文档。

          【讨论】:

          • 在 Windows 上使用 CMake
          • 如果您是 Windows 并使用 CMake,并且当您在 IDE 外部单击它时,应用程序在终端后显示,这是正确的解决方案。
          • 感谢@AmooHesam 指出这一点。我更新了我的答案。
          猜你喜欢
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-24
          • 1970-01-01
          • 2010-10-27
          相关资源
          最近更新 更多