代码之家  ›  专栏  ›  技术社区  ›  Paul Dixon

为什么我的Qt4.5应用程序会在Windows下打开一个控制台窗口?

  •  30
  • Paul Dixon  · 技术社区  · 15 年前

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

    我能阻止它这样做吗?

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

    编辑 :我刚刚在Windows下用qt creator创建了一个简单的测试GUI应用程序,它没有显示这种行为。要么这种行为是由于在Linux下创建项目的方式,要么是我的应用程序所做的事情导致了控制台窗口的出现。在我诊断的时候会发布详细信息,以防它帮助其他人。

    10 回复  |  直到 6 年前
        1
  •  17
  •   Paul Dixon    15 年前

    简短的回答是,包含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
    

    哎呀!子系统是Windows,不再有控制台窗口。

        2
  •  8
  •   John T    15 年前

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

    编辑:

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

    -Wl,-subsystem,windows
    
        3
  •  8
  •   fbeeper    11 年前

    我认为这不是这个具体答案的解决办法(而且是4年后的问题)。 但我认为,许多人在这个线程中会寻找这个设置:

    项目>生成并运行>运行设置>运行> [X]磨合终端

    取消选择它,在没有额外终端窗口的情况下从qtcreator运行GUI。然后,终端输出将嵌入到IDE中。

        4
  •  5
  •   plasmacel example    6 年前

    对于那些使用cmake解决此问题的人,我找到了真正的解决方案 here . 由本人核实。

    简而言之,您需要添加 WIN32 对你 add_executable() 声明:

    add_executable(GuiApplication WIN32 src/main.cpp)
    
        5
  •  4
  •   bluebrother    15 年前

    确保.pro文件没有添加 console 变量 CONFIG . 您可以通过添加

    CONFIG -= console
    

    在你的.pro文件的末尾。如果 配置 包含 慰问 每次启动程序时都会弹出一个窗口,在打印调试输出时也会使用该窗口。因此,增加 慰问 在调试程序时很有用。否则你需要使用像 DebugView 以显示 qDebug() 电话。

        6
  •  3
  •   Paul Kelly    15 年前

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

    我研究了如何使用mingw/gcc来实现这一点。的联机文档 gcc 显示Windows目标的不同选项。像其他人所说的,你正在寻找的选项是-mwindows。选项-mwindows创建一个窗口应用程序。您当前的设置似乎是-mconsole。选项-mconsole生成一个控制台应用程序。这是一个链接器选项。我不熟悉qt creator,但我猜想它有一种类似的方式来查看项目设置,就像Visual Studio一样。

        7
  •  3
  •   Craig    13 年前

    我用cmake代替qmake。我使用了set(cmake_cxx_flags“-mwindows”)。 好像 qmake_cxflags+=-mWindows 在你的.pro文件中也会这样做。

        8
  •  1
  •   Artem Zaytsev    9 年前

    去: Projects --> Run 不检查 Run in terminal 复选框

        9
  •  0
  •   Alex Ruse    15 年前

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

    修复方法是将“-mwindows”添加到编译器的参数列表中,这也将无形地添加所需的库(-lkernel32、-lgdi32等)。您可能需要将main()更改为winmain()作为入口点。

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

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

        10
  •  0
  •   Eda    14 年前

    qt/2009.05/qt/mkspecs/win32-g++
    编辑文件qmake.conf
    修改线
    qmake-lflags-console=-wl,-子项,控制台

    qmake-lflags-console=-wl,-子项,窗口

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