Перейти к основному содержимому

Компилятор GCC. Первая программа на Windows

Что такое GCC

GCC (GNU Compiler Collection) — набор компиляторов для различных языков программирования, включая C, C++, Fortran. Для Windows доступен через проекты MinGW-w64 и MSYS2.

Установка GCC на Windows

Шаг 1: Скачайте установщик с msys2.org

Шаг 2: Запустите установщик и следуйте инструкциям

Шаг 3: После установки откройте MSYS2 UCRT64 и выполните:

pacman -S mingw-w64-ucrt-x86_64-gcc
pacman -S mingw-w64-ucrt-x86_64-gdb

Шаг 4: Добавьте в PATH:

C:\msys64\ucrt64\bin

Проверка установки:

gcc --version

Настройка переменной PATH

Через графический интерфейс

  1. Откройте "Свойства системы" (Win + Pause)
  2. "Дополнительные параметры системы"
  3. "Переменные среды"
  4. В разделе "Системные переменные" найдите PATH
  5. Нажмите "Изменить" и добавьте путь к bin папке

Через PowerShell (администратор)

[Environment]::SetEnvironmentVariable("Path",
$env:Path + ";C:\msys64\ucrt64\bin",
[EnvironmentVariableTarget]::Machine)

Первая программа

hello.c
#include <stdio.h>
#include <windows.h>

int main(void) {
// Установка кодировки для кириллицы
SetConsoleCP(65001);
SetConsoleOutputCP(65001);

printf("Привет, Windows!\n");
printf("Компилятор: GCC %d.%d.%d\n",
__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__);

return 0;
}

Компиляция и запуск

Командная строка (cmd)

gcc hello.c -o hello.exe
hello.exe

PowerShell

gcc hello.c -o hello.exe
.\hello.exe

Makefile для Windows

Makefile
CC = gcc
CFLAGS = -Wall -std=c11
TARGET = hello.exe

$(TARGET): hello.c
$(CC) $(CFLAGS) hello.c -o $(TARGET)

clean:
del $(TARGET)

run: $(TARGET)
$(TARGET)

Использование:

mingw32-make
mingw32-make run
mingw32-make clean

Флаги компиляции GCC

ФлагОписаниеПример
-oИмя выходного файлаgcc hello.c -o program.exe
-WallВсе предупрежденияgcc -Wall hello.c
-WextraДополнительные предупрежденияgcc -Wextra hello.c
-gОтладочная информацияgcc -g hello.c
-O2Оптимизация уровня 2gcc -O2 hello.c
-std=c11Стандарт C11gcc -std=c11 hello.c
-staticСтатическая линковкаgcc -static hello.c
-m32 / -m6432/64-битная сборкаgcc -m64 hello.c

Работа с библиотеками Windows

Подключение Windows API

winapi_example.c
#include <stdio.h>
#include <windows.h>

int main(void) {
// Получение информации о системе
SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);

printf("Процессоров: %u\n", sysInfo.dwNumberOfProcessors);
printf("Тип процессора: %u\n", sysInfo.dwProcessorType);
printf("Размер страницы: %u байт\n", sysInfo.dwPageSize);

// Показ MessageBox
MessageBox(NULL, "Hello from GCC!", "GCC on Windows", MB_OK);

return 0;
}

Компиляция:

gcc winapi_example.c -o winapi_example.exe -luser32
Совет

Флаг -luser32 подключает библиотеку User32.dll для функции MessageBox

Отличия GCC на Windows от Linux

АспектWindowsLinux
Исполняемый файл.exeбез расширения
Разделитель путей\ (обратный слеш)/ (прямой слеш)
Библиотеки.dll / .lib.so / .a
Системные вызовыWindows APIPOSIX
Кодировка консолиCP866 / CP1251 / UTF-8UTF-8
Переносы строк\r\n (CRLF)\n (LF)

Решение проблем с кодировкой

Проблема: Кириллица отображается неправильно

Решение 1: Установка кодировки UTF-8

#include <windows.h>
SetConsoleCP(65001);
SetConsoleOutputCP(65001);

Решение 2: Использование wide characters

#include <wchar.h>
#include <locale.h>

int main(void) {
setlocale(LC_ALL, "");
wprintf(L"Привет, мир!\n");
return 0;
}

Решение 3: Изменение кодировки консоли

chcp 65001

Создание DLL библиотеки

mylib.c
#include <stdio.h>

__declspec(dllexport) void say_hello(const char* name) {
printf("Hello, %s from DLL!\n", name);
}

__declspec(dllexport) int add(int a, int b) {
return a + b;
}
main.c
#include <stdio.h>

__declspec(dllimport) void say_hello(const char* name);
__declspec(dllimport) int add(int a, int b);

int main(void) {
say_hello("Windows");
printf("2 + 3 = %d\n", add(2, 3));
return 0;
}

Компиляция:

:: Создание DLL
gcc -shared -o mylib.dll mylib.c

:: Компиляция программы с DLL
gcc main.c -o main.exe -L. -lmylib
Важно

При запуске программы mylib.dll должна находиться в той же папке или в PATH

Интеграция с IDE

Visual Studio Code

  1. Установите расширение "C/C++"
  2. Создайте файл .vscode/tasks.json:
.vscode/tasks.json
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "GCC Build",
"command": "gcc",
"args": [
"-g",
"-Wall",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}

Code::Blocks

  1. Settings → Compiler
  2. Выберите "GNU GCC Compiler"
  3. Укажите путь к компилятору в "Toolchain executables"

Полезные утилиты

УтилитаОписаниеПример использования
gcc -vПодробная информация о компиляцииgcc -v hello.c
gcc -dumpversionВерсия GCCgcc -dumpversion
gcc -dumpmachineЦелевая платформаgcc -dumpmachine
objdumpАнализ объектных файловobjdump -d hello.exe
nmСписок символовnm hello.exe
ldd (MSYS2)Зависимостиldd hello.exe
gdbОтладчикgdb hello.exe

Практическое задание

Задание: Создайте программу, которая выведет в консоли "Hello, World!"
Показать решение
#include <stdio.h>

int main() {

printf("Hello, World!");

return 0;
}

Компиляция:

gcc hello.c -o hello.exe
hello.exe

Дополнительные материалы