Как я не позволяю моей программе Qt C ++ открывать консоль в Windows? - PullRequest
9 голосов
/ 24 ноября 2011

Я делаю приложение в Qt Creator с cmake и MinGW в качестве компилятора. Я видел ответ на этот вопрос для других людей, но они использовали обычные проекты Qt с файлами .pro, а я использую файл CMakeLists.txt. Так что эти посты мне не помогли.

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

Ответы [ 5 ]

4 голосов
/ 24 ноября 2011

Скорее всего, в вашем CMakeLists.txt будет строка, подобная следующей:

ADD_EXECUTABLE(exename ....)

, где, конечно, точки являются дополнительными аргументами.Измените это на:

ADD_EXECUTABLE(exename [WIN32] ...)

, чтобы указать, что это приложение Win32, а не консольное приложение.

Или, как можно найти на веб-сайте CMAKE «Если задано WIN32, свойство WIN32_EXECUTABLE будет установлено для созданной цели».И когда WIN32_EXECUTABLE установлен, он « Создает исполняемый файл с точкой входа WinMain на окнах ».

2 голосов
/ 10 апреля 2016

По умолчанию, в отличие от qmake, cmake создает приложения 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()

Свойство WIN32_EXECUTABLE не действует при компиляции на платформах, отличных от Windows (см. CMAKE_WIN32_EXECUTABLE).

Как и в случае переменной WIN32 cmake, свойство WIN32_EXECUTABLE также настраивает окно консоли при компиляции исполняемого файла win64.

1 голос
/ 06 апреля 2014

У меня была та же проблема, но я решил ее, добавив:

#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

0 голосов
/ 27 февраля 2017

Это старый вопрос, но в любом случае, есть лучшее решение, чем все другие, размещенные здесь:

CMAKE_POLICY(SET CMP0020 NEW)

Добавление этого автоматически обработает все для вас. На самом деле CMake должен вывести предупреждение, если вы не установили эту политику, по крайней мере, так я узнал о ее существовании.

0 голосов
/ 24 ноября 2011

Для сборки с помощью Mingw добавьте команду CMake:

set_target_properties(target_name PROPERTIES LINK_FLAGS "-mwindows")

Замените target_name именем вашей цели (первый параметр для add_executable)

...