Почему мое приложение Qt 4.5 открывает окно консоли под Windows? - PullRequest
30 голосов
/ 17 апреля 2009

Я играл с Qt Creator 4.5 под Linux. Мое приложение прекрасно работает под Linux, но если я собираю в Windows, приложение всегда открывает окно консоли при запуске.

Могу ли я остановить это, делая это?

Я строю, используя настройки MinGW по умолчанию, возможно, это связано. При необходимости я могу собрать с Visual Studio, но я хотел бы понять, что происходит в первую очередь ...

Редактировать : Я только что создал простое тестовое приложение с графическим интерфейсом для Qt Creator под Windows, и оно не показывало такого поведения. Либо это происходило из-за способа, которым проект был создан под Linux, либо из-за того, что мое приложение делает, что вызывает появление окна консоли. Буду публиковать подробности, когда я его диагностирую, если это поможет кому-то еще.

Ответы [ 10 ]

17 голосов
/ 20 апреля 2009

Краткий ответ: включение 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

Ура! Подсистема - это окна, больше нет консольных окон.

9 голосов
/ 06 октября 2013

Я думаю, что это не решение для этого конкретного ответа (кроме того, это 4 года спустя), но я думаю, что многие люди, приземляющиеся в этой теме, будут искать этот параметр:

Проекты> Построить и запустить> Настройки запуска> Выполнить> [x] Выполнить в терминале

Отмените выбор и запустите ваш графический интерфейс из QtCreator без дополнительного окна терминала. Выход терминала будет встроен в IDE.

8 голосов
/ 17 апреля 2009

Вам нужно убедиться, что указан ключ -mwindows.

Edit:

вы также можете зайти в свой make-файл и добавить его к своим флагам компоновщика:

-Wl,-subsystem,windows
5 голосов
/ 10 апреля 2016

Для тех, у кого есть проблема с использованием CMake, я нашел реальное решение здесь . Проверено мной.

Короче говоря, вам нужно добавить WIN32 к вашим add_executable() заявлениям:

add_executable(GuiApplication WIN32 src/main.cpp)
4 голосов
/ 18 апреля 2009

Убедитесь, что ваш .pro-файл не добавляет console к переменной CONFIG. Вы можете сделать это, добавив

CONFIG -= console

где-то в конце вашего .pro-файла. Если CONFIG содержит console, то окно появляется каждый раз, когда вы запускаете программу, и это также используется при выводе отладочной информации. Таким образом, добавление console может быть полезно при отладке программы. В противном случае вам нужно будет использовать такие инструменты, как DebugView , чтобы показать результаты вызовов qDebug().

3 голосов
/ 13 ноября 2011

Я использую cmake вместо qmake. Я использовал набор (CMAKE_CXX_FLAGS "-mwindows") кажется, как будто QMAKE_CXXFLAGS + = - mwindows в вашем .pro файле будет делать то же самое.

3 голосов
/ 17 апреля 2009

Похоже, настройки вашего компоновщика установлены для консольного приложения. Вы можете попробовать настроить компоновщик на использование параметра / subsystem: windows. Опция для консольных приложений - / subsystem: console. Если вы строите свой проект в Visual Studio, создайте проект Win32. Не создавайте консольное приложение Win32. Параметр для настройки подсистемы в Visual Studio находится в разделе «Параметры проекта» -> «Линкер» -> «Система» -> «Подсистема». Выберите Windows (/ подсистема: Windows).

Я посмотрел, как это сделать с MinGW / gcc. В интерактивных документах для gcc показаны различные параметры для целей Windows. Как и другие заявили, вариант, который вы ищете, -mwindows. Опция -mwindows создает оконное приложение. Похоже, что ваш текущий параметр -mconsole. Опция -mconsole создает консольное приложение. Это опция компоновщика. Я не знаком с Qt Creator, но, полагаю, он имеет аналогичный способ просмотра настроек проекта, как Visual Studio.

1 голос
/ 17 февраля 2015

Перейти к: Projects --> Run и снять флажок Run in terminal флажок

0 голосов
/ 03 февраля 2010

Qt / 2009,05 / Qt / mkspecs / win32-г ++
редактировать файл qmake.conf
изменить строку
QMAKE_LFLAGS_CONSOLE = -Wl, -subsyetem, console
до
QMAKE_LFLAGS_CONSOLE = -Wl, -subsyetem, windows

и измените файл ???. Pro (например, добавьте новую строку или пробел)
и составление
работает нормально

0 голосов
/ 17 апреля 2009

По умолчанию компоновщик предполагает, что вы хотите консольное приложение.

Исправление заключается в добавлении «-mwindows» в список аргументов вашего компилятора, и это также незаметно добавит необходимые библиотеки (-lkernel32, -lgdi32 и т. Д.). Вам, вероятно, придется перейти с main () на WinMain () в качестве точки входа.

RE: ваш Edit: система сборки Qt использует «spec» файлы для добавления переменных, вы можете найти их в $ QTDIR / qt / mkspecs. Когда вы создаете новое приложение Windows в QCreator, оно устанавливает в качестве спецификации по умолчанию «win32-g ++», которая автоматически устанавливает правильные переменные (приложение Windows, флаги компоновщика и т. Д.).

Когда вы создавали проект под Linux, он использовал другую спецификацию, и это вызвало вашу проблему. Вы можете увидеть текущую спецификацию в файле "yourproject.pro.user".

...