VSCode: Компилировать файл

В одной заметке я разбирал ошибки при компиляции файла 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
      }

Эти строчки указывают на то, что данная задача является дефолтовой для компиляции. Т.е. пункт меню TerminalRun Build Task… вызовет именно эту задачу.

Пример целого файла

Чтобы не было путаницы, на всякий случай приведу полный пример своего файла 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
      }
    }
  ]
}

Данные манипуляции позволяют нам запускать задачу компиляции либо через меню (TerminalRun Build Task…), либо горячей клавишей Ctrl+Shift+B. При этом логи будут отображены в терминальном окошке.

На текущий момент я не знаю, как сделать условие для запуска (или НЕ запуска) задачи компиляции. Например, если открыть файл name1.java или name2.json, то данная задача будет активна и для них. Т.е. её нельзя отключить по расширению (может и можно, но я не знаю как).

 

Запуск без отладки

Чтобы после сборки проекта не нужно было открывать папку с готовым файлом и запускать его вручную, можно добавить в файл 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++ выдаст ошибки :)



Подписаться
Уведомление о
guest
0 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments