MinGW + Visual Studio Code. Руководство для старта

Данный текст будет полезен тем, кто давно хотел слезть с иглы тяжеленных IDE, но настройка компилятора под себя — казалось делом неблагодарным и запутанным.

VS Code — это лишь редактор кода. Это не среда разработки — здесь нет встроенного компилятора или дебаггера. Здесь есть только их поддержка. Чем более инструмент универсален — тем сложнее вначале разобраться в его особенностях. Однако, здесь нет ничего невозможного! Если правильно один раз настроить VS Code, то вы получите замечательную среду с помощью которой можно поддерживать различные проекты на совершенно разных языках.

VS Code является легковесным, кроссплатформенным редактором кода. Одной из его главных особенностей является поддержка кучи плагинов. Плагины позволяют расширять технологию IntelliSense (автодополнение кода) на разные языки программирования, добавлять поддержку специфического оборудования, отладчиков и прочее. Очень приятная и гибкая цветовая схема не раздражает даже после многочасового просиживания в процессе работы.

В общем-то поэтому решил написать как подготовить себе приятную среду разработки. В данном случае — под C и C++

Картинки кликабельны. И их максимально много. Если считаете, что что-то слишком очевидно, то пропустите этот момент

Чаще всего используется компилятор gcc. Данный компилятор обычно идет совместно с Unix-осью. Для того, чтобы работать с этим компилятором на Windows, нужно установить некоторые инструменты разработки. Есть два больших и известных проекта, созданных с данной целью:

  • MinGW
  • Cygwin

Главное их отличие в том, что MinGW сосредоточен в основном на компиляторе с некой поддержкой системных команд, в то время как Cygwin старается эмулировать полноценную UNIX-среду.

Обсуждение на Stack Overflow на эту тему

https://stackoverflow.com/questions/771756/what-is-the-difference-between-cygwin-and-mingw

Установка MinGW

Первым делом нужно убедится, что на компьютере уже не установлен компилятор gcc. Нажмем Win+R и вызовем командную строку.

C:\Users\User> gcc -version

Если компилятор не установлен — выведется сообщение, что программа не найдена. Иначе, можно опустить установку и настройку MinGW и переходить прямо к разделу с настройкой VS Code.

Закрываем консоль («cmd«) и переходим на официальный сайт проекта MinGW http://www.mingw.org/.

Ищем ссылку «Download» и переходим. Должно открыться что-то подобное, как на рисунке снизу.

Выбираем необходимые нам пакеты. Нам нужен базовый пакет mingw32-base и mingw32-gcc-g++. Отмечаем их

Внимание — приписка 32 в названии не означает работу приложения только и/или нацеленно на 32-битной платформе

После чего применяем внесенные изменения

Видим, что будет установлено/обновлено 24 пакета

Новое окно сообщает об успешном применении изменений

Теперь можем перейти в папку установки и убедиться в том, что все необходимое установлено (g++.exe и gcc.exe)

Выполним проверку установки переменной PATH. Проведем такую же проверку, как и в начале. Нажмем Win+R и вызовем командную строку.

Попросим компилятор вывести его версию следующей командой:

C:\Users\User> gcc -version

Если все сработало как нужно, то переходим к разделу с настройкой VS Code.

Если в консоли появилась ошибка, то нужно настроить переменную PATH. Это глобальная системная переменная и содержит в себе каталог исполняемых программ. То есть её настройка позволяет запустить программу по имени, не указывая полный путь до исполняемого файла. Их есть два вида — отдельная для каждого пользователя и одна общесистемная, которая доступна каждому пользователю.

Как настроить переменную PATH

Переходим в «Этот компьютер» и нажимаем правую кнопку -> свойства.

Далее в левой колонке жмем «Дополнительные параметры среды«

Далее в «Переменные среды«

Выбираем в списке переменных сред для пользователя выбираем переменную PATH и жмем «Изменить«.

Жмем «Создать» и вписываем полный путь до папки MinGW\bin

Нажимаем «Ок» и снова вызываем командную строку — Win+Rcmd.

Внимание — чтобы изменения переменной PATH вступили в силу, командную строку нужно перезапустить, если она осталась открытой.

Выводим для проверки версию компилятора:

C:\Users\User> gcc -version

Заодно проверим дебаггер:

C:\Users\User> gdb -version

VS Code — Hellow World

Скачиваем с официального сайта абсолютно бесплатный VS Code.

https://code.visualstudio.com/

Процесс установки опустим — подсказок установщика достаточно

Для корректного автодополнения, дебага и подсказок по документации стоит установить расширение C/C++.

Расширения устанавливаются прямо из VS Code во вкладке «Extensions» или Ctrl+Shift+X. На нижней картинке эта вкладка подчеркнута в левом столбце.

Найдем через строку поиска C/C++ и установим.

Далее создаем папку будущего проекта в произвольном месте на компьютере. Свою назвал «helloworld«. Она будет папкой всего проекта, который вы будете разрабатывать. В VS Code открываем папку используя File > Open Folder…

Откроется проект. Пока он пустой. Создадим первый файл в проекте через File > New File

Чтобы VS Code начал предлагать подсказки по вводу и подсвечивать синтаксис, следует сразу после создания файла сохранить его в необходимом расширении. По сути сейчас вы определяете язык будущего проекта. Нажимаете File > Save… и в открывшемся окне выбираете тип файла. Т.к. наш тестовый проект пишется на Си, выбираем его в выпадающем списке Тип файла.

Теперь при вводе текста будут появляться подсказки с автодополнением. Для подстановки предложенного автодополнения можно нажать Tab. В VS Code достаточно много удобных хоткеев. Посмотреть все быстрые клавиши можно тут File > Preferences > Keyboard Shortcuts

Запишем наш код HelloWorld в файл. В принципе, можно писать любой код — главное, чтобы был вывод в консоль для отладки.

#include <stdio.h>

int main(void)
{
    char * msg = "Hello World";
    printf("%s", msg);
    return 0;
}

Настройка компилятора

Время перейти к настройке компилятора и дебаггера.

Компилятор позволит из написанного кода собрать рабочее приложение.

Переходим Terminal > Configure Default Build Task…

Мы изначально определили язык программирования (во время сохранения) и VS Code самостоятельно нашел компилятор — нам предложено задать сценарий работы с ним.

Если самостоятельно VS Code не нашла компилятор, то нужно редактировать файл c_cpp_properties.json, который идет вместе с расширением. Именно в данном файле настраивается путь к includePath

Подробнее по ссылке на официальном сайте. Ссылка актуальна на 2020 год.

https://code.visualstudio.com/docs/cpp/configure-intellisense-crosscompilation

Кликаем по предложенной подсказке.

Текст файла примерно такой:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "shell: gcc.exe build active file",
            "command": "C:\\MinGW\\bin\\gcc.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "C:\\MinGW\\bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
     }
   ]
}

Выглядит страшно, как и любой развернутый JSON

Гайд на официальном сайте vscode говорит о том, что этого достаточно, а если что-то идет не так, то отсылают почитать про функционал task.json. К сожалению, если оставить в таком виде, то собирать многофайловые проекты будет невозможно.

Если в вашем проекте будет НЕ больше одного файла, можете пропустить дальнейший текст и перейти к настройке дебаггера. Если планируется работать с несколькими файлами — рекомендую проделать дальнейшие манипуляции.

JSON — это текстовое представление данных/объектов (в основном в JS).
Обычно используется для передачи данных в парах Клиент-Сервер.
Массивы обозначаются квадратными скобками []
Ячейки обозначаются фигурными скобками {}
Обычная запись представляет собой пару ключ-значение через двоеточие:
{ «Ключ» : «Значение» }
Значение может быть массивом, ячейкой, массивом ячеек и т.д. — ограничений нет.

Коротко про JSON

Поле tasks содержит массив ( [массив] ), который состоит из ячеек отделенных фигурными скобками и запятыми ( [ {ячейка 1}, {ячейка 2}, {ячейка 3} ] ). В нашем случае этот массив содержит одну ячейку.

Создадим еще один элемент в массиве задач (task). Нужно скопировать все что есть в квадратных скобках (task[ вот это ]) и вставить через запятую в конце первой ячейки массива.

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "shell: gcc.exe build active file",
            "command": "C:\\MinGW\\bin\\gcc.exe",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "C:\\MinGW\\bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "type": "shell",
            "label": "shell: gcc.exe build active file",
            "command": "C:\\MinGW\\bin\\gcc.exe",
           "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "C:\\MinGW\\bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

Файл должен выглядеть примерно как указано выше. Следите за скобками и запятыми — если где-то будет ошибка VS Code сообщит. Удаляем ячейку «group» на строках 20-23. Этот параметр отвечает за выбор компилятора, который будет запущен по-умолчанию.

Нас сейчас больше всего интересуют строки с 27 по 31.

Изменим значение ячейки «label» на 27 строке на любое название. Пусть будет build c project. Именно по этому имени мы сможем понять какой именно компилятор сейчас выбран.

Ячейка «command» — это команда, которая будет передана в терминал/консоль для старта компиляции. Как мы видим, все правильно, это путь к gcc.exe.

Ячейка «args» — это список аргументов, который будет передан после команды. Не пугайтесь, мы уже это делали. Чуть ранее мы узнавали версию gcc путем передачи аргумента -version.

  1. «-g» указывает компилятору на необходимость вставлять в готовое приложение отладочную информацию — номера строк, имена переменных и т.д. Необходимо для корректной работы дебаггера (отладчика) GDB;
  2. Следующим аргументом идёт файл или список файлов. «${file}» означает текущий файл. То есть компилятору будет передан только один файл. Мы хотим, чтобы сюда входили все файлы из определенной директории. Да, одним из решений будет вписывать сюда каждый созданный .c файл, но разве это удобно? Значит записываем сюда конструкцию: Из этой директории, взять все .c-файлы. Получится следующее: «${fileDirname}/**.c«
  3. Аргумент вывода файла
  4. Путь вывода скомпилированного приложения.

В итоге, добавленная нами часть будет выглядеть следующим образом:

         {
            "type": "shell",
            "label": "build c project",
            "command": "C:\\MinGW\\bin\\gcc.exe",
            "args": [
                "-g",
                "${fileDirname}/**.c",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "C:\\MinGW\\bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

Подробнее про task.json

https://code.visualstudio.com/docs/editor/tasks

Настройка отладчика

Теперь настроим дебаггер или отладчик. Переходим в наш файл с кодом, далее Run > Add Configuration…

Выбираем окружение GDB

Выбираем Сборка и отладка активного файла

Если возникла ошибка и открылось окно, нажмите на нем Abort. Это лишь значит, что не удалось собрать приложение — может быть синтаксическая ошибка.

Далее откроется файл launch.json

Для тех, кто добавлял свой task: Изменим значение preLaunchTask на то название, которое придумали для своего компилятора. В моем случае — это «build c project«. Чтобы не было путаница стоить изменить и поле «name«. Можете как и прошлом примере добавить еще одну конфигурацию запуска в массив конфигураций, оставив первоначальную без изменений.

Запускаем приложение

Снова переходим в созданный файл с кодом и выбираем Terminal > Run Build Task…

Эта команда проведет все шаги компиляции приложения и создаст в целевой папке исполняемый файл с расширением .exe

На картинке выше красным подчеркнут выпадающий список открытых терминалов (без паники — это как несколько cmd-консолей или терминалов в линуксе). Синим (правее красной линии, видно плохо) подчеркнуты элементы управления списком терминалов — их можно добавить, удалить или поставить парочку рядом.

Как мы видим, процесс компиляции завершился без ошибок и в списке файлов проекта появился .exe.

Создадим новый терминал.

Как мы видим, изменился порядковый номер нового терминала. Также видно, что мы находимся в папке с проектом. Отсюда можно вызвать наше скомпилированное приложение. Можно начать набирать его имя и нажать Tab и сработает автодополнение. На каждое следующее нажатие терминал предложит различные подходящие варианты под то, что имелось ввиду. Если предложить нечего — ничего не произойдет.

Вызовем наше приложение. В моем случае:

> .\hellowd_main.exe

Замечательно, вывод сработал как надо.

Теперь инициируем отладку/дебаггинг этого приложения, чтобы посмотреть как это работает.

Установим «Breakpoint» или точку останова. Все как в классических IDE.

Запускаем отладку Run > Start Debugging или f5

Выполнение программы было приостановлено в том месте, которое мы пометили точкой останова.

Открылось другое окно редактора, которое специально подготовлено для работы в режиме отладки. В левой части окна появилось четыре секции:

  • VARIABLES все переменные
  • WATCH сюда, через знак плюса можно добавлять переменные, функции и т.д. по имени
  • CALL STACK стек вызовов функции. В общих чертах — функции часто вызываются в теле других функций.
  • BREAKPOINTS все точки останова

Текущая выполняемая строка подсвечивается и имеет желтый указатель строки

Управление ходом отладки программы тоже удобное и классическое.

  • Продолжить
  • Сделать шаг
  • Пройти «внутрь» текущей строки
  • Выйти на уровень выше
  • Перезапуск отладки
  • Остановка отладки

Удачного освоения инструмента

Comment

programel