В одной заметке я разбирал ошибки при компиляции файла C++ с примером вызова сообщения на WinAPI. Изначально я хотел просто разобрать тот пример, но в итоге пришлось разбираться с ошибками в Visual Studio. Если это только начало, и мне и дальше придётся переделывать каждый пример, чтобы избавится от ошибок, то я решил компилировать эти проекты на MinGW-w64. Осталась проблема удобства — VSCode это редактор кода, а не среда разработки, поэтому компилировать и собирать проект она не умеет. Можно это сделать с помощью расширений, но там есть только расширение для работы с Visual Studio Community. Для MinGW такого нет. Как перенастроить расширение для работы с MinGW я не нашёл. Зато там есть Задачи (Tasks), через них я и настрою автоматизацию данного процесса…
Поскольку данную заметку читают люди, изучающие программирование, то для них не будет сильно трудно понять, какие именно нужно внести изменения в файл tasks.json. У меня полный путь к файлу такой:
"C:\Users\Denis\AppData\Roaming\Code\User\tasks.json"
Фрагмент кода для запуска компиляции файла я сделал следующим:
{
"label": "Compile C++ project",
"detail": "Compile selected C++ project with MinGW",
"type": "process",
"windows": {
"command": "D:\\Distr-free\\Programming\\MinGW-w64 - for 32 and 64 bit Windows (C++)\\MingW-Portable\\mingw64\\bin\\g++.exe"
},
"args": [
"${file}",
"-o ${fileBasenameNoExtension}.exe"
],
"presentation": {
"reveal":"always"
},
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
}
Здесь важно сделать некоторое примечание — поскольку данная задача запускает процесс компиляции, то нам важно знать её результат. Скорее всего будут ошибки, о которых нам сообщит лог. Чтобы его видеть, нужна следующая опция:
"presentation": {
"reveal":"always"
}
Если оставить её значение в «never», то мы просто не увидим, какие были ошибки и были ли они вообще, т.к. в этом случае консоль лога не будет появляться.
При компиляции g++.exe использует несколько ключей, поэтому мы их указываем через запятую:
"args": [
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
Здесь же я использовал переменную fileBasenameNoExtension, чтобы задать имя для создаваемого файла.
"group": {
"kind": "build",
"isDefault": true
}
Эти строчки указывают на то, что данная задача является дефолтовой для компиляции. Т.е. пункт меню
▶ вызовет именно эту задачу.Пример целого файла
Чтобы не было путаницы, на всякий случай приведу полный пример своего файла tasks.json:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Open in browser (Online)",
"detail": "Displays online help for the selected keyword",
"type": "process",
"windows": {
"command": "C:\\Program Files\\Mozilla Firefox\\firefox.exe"
},
"presentation": {
"reveal": "never"
},
"args": [
"https://docs.unity3d.com/ScriptReference/30_search.html?q=${selectedText}"
],
"problemMatcher": []
},
{
"label": "Open in browser (Offline)",
"detail": "Displays offline help for the selected keyword",
"type": "process",
"windows": {
"command": "C:\\Program Files\\Mozilla Firefox\\firefox.exe"
},
"args": [
"file:///C:/Program Files/Unity Hub/Documentation/en/ScriptReference/30_search.html?q=${selectedText}"
],
"presentation": {
"reveal": "never"
},
"problemMatcher": []
},
{
"label": "Compile C++ project",
"detail": "Compile selected C++ project with MinGW",
"type": "process",
"windows": {
"command": "D:\\Distr-free\\Programming\\MinGW-w64 - for 32 and 64 bit Windows (C++)\\MingW-Portable\\mingw64\\bin\\g++.exe"
},
"args": [
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"presentation": {
"reveal":"always"
},
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
Поскольку я использую VSCode только на Windows, то данный файл можно оптимизировать, если убрать свойство, имеющее отношение к особенностям операционной системы. В нашем случае команда для запуска компилятора будет только для ОС Windows, поэтому уберём этот селектор. Данное действие также позволит избавится от таких предупреждений:
Missing property «command». [32, 5]
Окончательный код файла tasks.json будет таким:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Open in browser (Online)",
"detail": "Displays online help for the selected keyword",
"type": "process",
"command": "C:\\Program Files\\Mozilla Firefox\\firefox.exe",
"presentation": {
"reveal": "never"
},
"args": [
"https://docs.unity3d.com/ScriptReference/30_search.html?q=${selectedText}"
],
"problemMatcher": []
},
{
"label": "Open in browser (Offline)",
"detail": "Displays offline help for the selected keyword",
"type": "process",
"command": "C:\\Program Files\\Mozilla Firefox\\firefox.exe",
"args": [
"file:///C:/Program Files/Unity Hub/Documentation/en/ScriptReference/30_search.html?q=${selectedText}"
],
"presentation": {
"reveal": "never"
},
"problemMatcher": []
},
{
"label": "Compile C++ project",
"detail": "Compile selected C++ project with MinGW",
"type": "process",
"command": "D:\\Distr-free\\Programming\\MinGW-w64 - for 32 and 64 bit Windows (C++)\\MingW-Portable\\mingw64\\bin\\g++.exe",
"args": [
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"presentation": {
"reveal":"always"
},
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
Данные манипуляции позволяют нам запускать задачу компиляции либо через меню (
▶ ), либо горячей клавишей Ctrl+Shift+B. При этом логи будут отображены в терминальном окошке.
Запуск без отладки
Чтобы после сборки проекта не нужно было открывать папку с готовым файлом и запускать его вручную, можно добавить в файл keybindings.json горячую клавишу для запуска задачи «Start without Debugging»:
{
"key": "ctrl+f5",
"command": "workbench.action.tasks.runTask",
"args": "Start without Debugging"
},
Чтобы эта комбинация сработала, нужно дополнить файл задач tasks.json:
{
"label": "Start without Debugging",
"detail": "Start compiled file without Debugging",
"type": "process",
"command": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"presentation": {
"reveal":"always"
},
"problemMatcher": []
}
Примечание
У описанного в этой статье метода всё же есть несколько недостатков. Один из них — невозможность отлаживать код. Другой — Intellisence для windows постоянно указывает на ошибки. Например такие:
argument of type «const char *» is incompatible with parameter of type «LPCWSTR»
Их можно игнорировать и тогда код будет успешно скомпилирован. Или их можно исправить, но тогда компилятор g++ выдаст ошибки :)
- C#: Сравнить два массива - 12.12.2024
- EVE-Online: Фильтры каналов - 23.11.2024
- Не приходит СМС для авторизации на сайте Госуслуги - 01.11.2024