В процессе обучения или тестирования может возникнуть необходимость создать исполняемый файл без IDE Qt Creator. Здесь будет рассмотрены способы создания простых проектов из одного файла под Windows.
Требуемые файлы из MinGW и QT содержатся в директориях, подобно указанным ниже (возможно их придётся прописать переменной окружения PATH или указывать полный путь к файлам типа gcc.exe, g++.exe, qmake, mingw32-make)
C:\Qt\Qt6.2.4\6.2.4\mingw_64\bin\
C:\Qt\Qt6.2.4\Tools\mingw1120_64\bin\
Самый простой и минималистичный способ при написании программы С++ без использования QT.
Создаем файл с расширением .cpp текстом программы, например создадим файл main.cpp со следующим содержимым:
#include <iostream>
int main(){
std::cout << "Hi my dear friend!!!";
char * ch =new char();
std::cin >> ch; // Нужно чтобы программа сразу не закрывалась
return 0;
}
Дадим команду в консоли Windows
C:\Qt\Qt6.2.4\Tools\mingw1120_64\bin\g++.exe main.cpp
Рядом с нашим файлом должен появиться исполняемый файл нашей программы.
2) Создаем start.bat файл со следующим содержимым: (прописать свой путь к g++.exe в первой строке)
C:\Qt\Qt6.2.4\Tools\mingw1120_64\bin\g++.exe main.cpp -lgdi32 -O3 -s -mwindows
PAUSE
REM -lgdi32 нужен для графики и должен быть после *.cpp
REM -s нужен для сборки release, во всяком случае без него размер исполняемого файла больше
REM -mwindows нужен для сборки windows приложения
REM -O3 уровень оптимизации -O0 без оптимизации, -O3 максимальная оптимизация
2) Создаем файл main.cpp с кодом windows программы.
#if defined(UNICODE) && !defined(_UNICODE)
#define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
#define UNICODE
#endif
#include <tchar.h>
#include <windows.h>
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
//TCHAR szClassName[ ] = _T("Мой первый проект");
const char szClassName[] = "Тестовый проект";
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = (HICON)LoadImage(NULL, "icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); // Таскбар icon.ico должна быть рядом с main.cpp
wincl.hIconSm = (HICON)LoadImage(NULL, "icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); // Приложение icon.ico должна быть рядом с main.cpp
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL; /* No menu */
wincl.cbClsExtra = 0; /* No extra bytes after the window class */
wincl.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default colour as the background of the window */
wincl.hbrBackground = CreateSolidBrush(RGB(240, 240, 240));
/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
return 0;
/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
0, // Extended possibilites for variation
szClassName, // Classname
szClassName, // Текст формы
WS_OVERLAPPEDWINDOW, // default window */
CW_USEDEFAULT, // Windows decides the position
CW_USEDEFAULT, // where the window ends up on the screen
544, // Ширина окна программы
300, // Высота окна программы
HWND_DESKTOP, // The window is a child-window to desktop */
NULL, // No menu */
hThisInstance, // Program Instance handler */
NULL // No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow (hwnd, nCmdShow);
/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_CREATE:
{
CreateWindow(TEXT("button"), TEXT("Beep"),
WS_VISIBLE | WS_CHILD ,
20, 50, 80, 25,
hwnd, (HMENU) 1, NULL, NULL);
CreateWindow(TEXT("button"), TEXT("Quit"),
WS_VISIBLE | WS_CHILD ,
120, 50, 80, 25,
hwnd, (HMENU) 2, NULL, NULL);
break;
}
case WM_COMMAND:
{
if (LOWORD(wParam) == 1) {
Beep(40, 50);
}
if (LOWORD(wParam) == 2) {
PostQuitMessage(0);
}
break;
}
case WM_DESTROY:
PostQuitMessage (0); /* send a WM_QUIT to the message queue */
break;
default: /* for messages that we don't deal with */
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
3) Запустить start.bat, должен появиться возле него исполняемый файл a.exe.
При использовании каких либо библиотек Qt, способ приведенный выше не подойдет.
1. Создадим файл main.cpp
#include <QDebug>
#include <cstdlib>
int main(){
qDebug() << "Hi my dear friend!!!";
system("pause"); //другой способ чтобы программа сразу не закрывалась
return 0;
}
2. Создадим файл start.bat
rem создает файл .pro
qmake -project
rem создает Makefile, Makefile.Debug, Makefile.Release и пустые папки release и debug. Указываем делать консольное приложение, без этого не выводило строки на экран
qmake "CONFIG += console"
rem создает exe
mingw32-make
pause
Запускаем start.bat файл, в папке release должен появиться наш исполняемый файл.
1. Для создания графического GUI приложения создадим файл gui.cpp
#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel *label = new QLabel("Hello");
label -> show();
return app.exec();
}
2. Создадим файл start.bat
rem создает файл .pro
qmake -project
rem создает Makefile. Подключаем модули
qmake "QT += core gui widgets" gui.pro
rem создает exe
mingw32-make
pause
Запускаем start.bat файл, в папке release должен появиться наш исполняемый файл с графическим GUI интерфейсом.