Я пытался создать исполняемый файл с использованием CMake, Qt и Visual Studio, который не показывает окно консоли.
Я нашел этот пост и этот ответ
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:mainCRTStartup")
Но мне было интересно, как QtCreator может создать исполняемый файл, который не показывает окно консоли без этого флага / ENTRY?
Чтобы избежать консольного окна в проекте Qt, который использует CMake и Visual Studio, необходимы четыре записи в CMakeLists.txt:
ADD_EXECUTABLE выглядит тогда так:
ADD_EXECUTABLE(YourProject WIN32
...stuff...
)
Для Visual Studio все четыре шага необходимы. Для MinGW шаг 4 представляется достаточным. Шаг 1 должен прийти перед шагом 2.
Что делают эти шаги?
QT_USE_QMAIN определен в include/QtGui/qwindowdefs.h
в источниках Qt. Удивительно, но больше ничего не делает, но:
#if defined(QT_NEEDS_QMAIN)
#define main qMain
#endif
С этим Qt определяет свою собственную точку входа. Конечно, для этого нужно где-то определить qMain. Поэтому необходимо включить дополнительную библиотеку, которая называется QtMain.lib.
Шаг 2 — это обычный CMake-способ поиска библиотек. В этом случае он включает в себя: путь / cmake-2.8 / Modules / UseQt4.cmake (Qt4).
Шаг 3 фактически связывает найденный QtMain.lib.
Шаг 4 заставляет Windows использовать / subsystem: windows вместо / subsystem: console
Хорошая вещь об этом, то, что шаг 1-3, возможно, не необходим в MinGW, но также не повредит. Поэтому нет необходимости различать Visual Studio и MinGW. Однако я тестировал только с Qt4. Это может быть иначе для Qt5.
Других решений пока нет …