34

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

我可以阻止它这样做吗?

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

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

4

10 回答 10

23

对于那些在Windows下使用CMake时遇到此问题的人(请参阅Amoo 的评论),这里有一个解决方案

简而言之,您需要在语句中WIN32添加add_executable()

add_executable(GuiApplication WIN32 src/main.cpp)

有关更多详细信息,请参阅 和 上的 CMakeadd_executable文档WIN32_EXECUTABLE

于 2016-04-10T10:43:18.297 回答
20

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

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

于 2009-04-20T09:21:33.720 回答
10

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

项目 > 构建和运行 > 运行设置 > 运行 > [x] 在终端中运行

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

于 2013-10-06T04:32:10.580 回答
9

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

编辑:

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

-Wl,-subsystem,windows
于 2009-04-17T13:14:41.377 回答
5

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

CONFIG -= console

.pro 文件末尾的某处。If CONFIGcontainsconsole每次启动程序时都会弹出一个窗口,并且在打印调试输出时也会使用此窗口。因此,console在调试程序时添加可能很有用。否则,您需要使用DebugView之类的工具来显示qDebug()调用的输出。

于 2009-04-18T17:44:07.570 回答
4

我使用 cmake 而不是 qmake。我使用 set(CMAKE_CXX_FLAGS "-mwindows") 似乎 QMAKE_CXXFLAGS +=-mwindows 在你的 .pro 文件中会做同样的事情。

于 2011-11-13T17:49:33.953 回答
3

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

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

于 2009-04-17T13:28:02.047 回答
2

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

于 2015-02-17T20:11:16.373 回答
1

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

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

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

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

于 2009-04-17T13:46:27.167 回答
0

Qt/2009.05/qt/mkspecs/win32-g++
编辑文件 qmake.conf
修改行
QMAKE_LFLAGS_CONSOLE = -Wl,-subsyetem,console

QMAKE_LFLAGS_CONSOLE = -Wl,-subsyetem,windows

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

于 2010-02-02T21:32:42.097 回答