Visual Studio Code и Microsoft Visual C++

Вы наверняка сталкивались с проблемой, что нужно «быстренько» скомпилировать некий код C++ и дальше заниматься своими делами. Можно поставить тяжеловесный Visual Studio 2022, а можно все это делать в Visual Studio Code. К тому же, наверняка Code у вас уже стоит. Сегодня в работе без него не обойтись. Для легких вещей используем Sublime Text, для более серьезных Visual Studio Code.

И так, возвращаемся к сабжу. Под VSC ставим расширения от Microsoft для работы с кодом C++. Начинаем настраивать. Делаем все по мануалу, ставим все необходимые библиотеки. Для теста подойдет простейший код «helloworld.cpp» оттуда же. А вот с первым тестовым запуском возникнут проблемы.

Во время настройки проекта в Code будет создан подкаталог «.vscode» и в нем будет лежать только один файл в формате json: «tasks.json». После того, как вы запустите debug, то появится новый файл «launch.json» и проект опять не соберется. Как бы вы ни шаманили, не били в бубны, не писали бы в разных форматах путь к компилятору в параметре «command» фала «tasks.json» – у вас не получится собрать проект.

vs code command prompt error C++

Попробуем разобраться

В каталоге «.vscode» есть три файла. Хотя третий не обязательный.

  • tasks.json – содержит инструкции сборки проекта. Именно от него зависит путь, где лежит компилятор C++.
  • launch.json – содержит инструкции для отладки проекта. В нем есть параметр: «preLaunchTask», который вызывает название Task из файла «tasks.json».
  • c_cpp_properties.json – необязательный файл, нужен для тонкой настройки подсказок редактора. Для первой сборки он нам не нужен.

Как решить проблему?

Собственно, в мануале Microsoft есть несколько предложений с советом, как решать данную проблему. Но они «замазаны» в тексте, что я их сразу не заметил. Если воспользоваться ими, то у вас все заработает «как часы».

Первым делом нужно правильно запустить сам Visual Studio Code. Для этого запускаем батник по шорткату из меню «Developer PowerShell for VS 2022» или «Developer Command Prompt for VS 2022» без разницы. В нем оптимально сразу перейти в каталог с проектом и запустить команду: «code .». После того, как стартует Code батник можно закрывать. Далее у вас все начнет собираться, запускаться и не надо заниматься шаманством.

Суть в том, что при запуске батника система узнает о новых переменных, параметрах компилятора, версии процессора и т.п. В принципе, это очень удобно, когда тебе надо запускать Code не с утра до вечера, а по мере необходимости.

В заключении

Хочу обратить ваше внимание на несколько нюансов, чтобы сэкономить время.

    • В файле запуска «launch.json» обратите внимание на параметр: “console“, которая отвечает за тип консоли, где будет запускаться проект. По умолчанию стоит параметр открывать проект во внешней консоли. Я себе поставил “integratedTerminal“, чтобы не уходить из оболочки Code.
    • В файле «launch.json» параметр “preLaunchTask” должен совпадать с параметром “label” из файла «tasks.json». Благодаря этому вы можете создавать кучу Task и работать с ними в зависимости от ваших нужд.
    • Также рекомендую в файле «launch.json» для начала изменить параметр “stopAtEntry” и поставить его в true. Выполнение проекта будет останавливаться при входе в функцию main().
  • А файл «tasks.json» можно оставить таким, как его сгенерировал Visual Studio Code.

Для наглядности два моих файла, которые позволяют собрать и отладить «helloworld.cpp».

Файл «tasks.json»

{
  "tasks": [
    {
      "type": "cppbuild",
      "label": "C/C++: cl.exe",
      "command": "cl.exe",
      "args": [
        "/Zi",
        "/EHsc",
        "/nologo",
        "/Fe${fileDirname}\\${fileBasenameNoExtension}.exe",
        "${file}"
      ],
      "options": { "cwd": "${fileDirname}" },
      "problemMatcher": [ "$msCompile" ],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "Task generated by Debugger."
    }
  ],
  "version": "2.0.0"
}

Файл «launch.json»

{
  "configurations": [
    {
      "name": "C/C++: cl.exe",
      "type": "cppvsdbg",
      "request": "launch",
      "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
      "args": [],
      "stopAtEntry": true,
      "cwd": "${fileDirname}",
      "environment": [],
      "console": "integratedTerminal",
      "preLaunchTask": "C/C++: cl.exe"
    }
  ],
  "version": "2.0.0"
}