Сборка приложения без IDE C++

В процессе обучения или тестирования может возникнуть необходимость создать исполняемый файл без 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\

Сборка консольного приложения средствами MinGW

Самый простой и минималистичный способ при написании программы С++ без использования 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

Рядом с нашим файлом должен появиться исполняемый файл нашей программы.

Сборка windows приложения средствами MinGW

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 без IDE

При использовании каких либо библиотек 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 должен появиться наш исполняемый файл.

Компиляция графического GUI приложения QT без IDE

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  интерфейсом.

2023-10-23



Понравилась страница?
Добавить в закладки
Или поделиться!

Связанные темы

Ассемблерный листинг С++
Бенчмарки в С++
Рисование в консоли windows на С++
Функции в С++
Параметры функции в С++
Глоссарий С++. Идентификаторы, квалификаторы, модификаторы, объявление, определение и т.д..
Исключения в С++. Выбрасывание и ловля исключения.
Достоинства и недостатки C++
Сборка приложения без IDE C++ с помощью MinGW и Qt
Перегрузка функций и операторов в С++
Случайные числа в С++. Полиномиальная генерация случайных чисел.
Ссылки в С++
Рекурсия в С++. Примеры рекурсивных программ и без использования.
Шаблоны C++
Наименование переменных и стиль программирования
Версия компилятора С++
Время выполнения программы C++