Как определить task.json для компиляции кода C/C++ в vscode с помощью cl.exe в Windows?

Я установил Microsoft Visual C++ Build Tools 2015 на свой 64-битный win10 и могу использовать cl.exe для компиляции и компоновки программы C/C++ в обычном окне командной строки, выполнив следующие шаги (некоторые инструкции из Установка переменных пути и среды для сборок командной строки):

 1. cd "\Program Files (x86)\Microsoft Visual Studio 14.0\VC"
 2. vcvarsall amd64
 3. cl helloworld.c

helloworld.c — это просто исходный файл C для печати «Hello world!». Я также пытаюсь настроить task.json для прямой компиляции и компоновки программ C/C++ в коде vs. Вот моя задача.json:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "0.1.0",
    "command": "vcvarsall amd64 && cl",
    "isShellCommand": true,
    "args": ["${file}"],
    "showOutput": "always"
}

И пути vsvarsall и cl были добавлены в PATH. Но все равно не работает (вывод выложен в конце поста). Итак, мой вопрос заключается в следующем: как я могу определить task.json, который может сначала запустить vcvarsall amd64 для установки системных переменных, а затем выполнить команду cl для компиляции и компоновки программ.

введите здесь описание изображения


person Yulong Ao    schedule 08.09.2016    source источник
comment
Может быть, дать какой-нибудь вывод о том, как это терпит неудачу?   -  person Rudolfs Bundulis    schedule 08.09.2016
comment
@RudolfsBundulis: я опубликовал результат в конце вопроса.   -  person Yulong Ao    schedule 08.09.2016
comment
Спасибо. Ну, я думаю, я не могу помочь без установки кода Visual Studio и проверки того, что именно происходит. Но почему вы не можете просто поместить то, что вам нужно, в файл .bat и указать на него параметр command? Это будет работать, и вам не придется беспокоиться о том, как VSC обрабатывает команду, поскольку то, что вы сейчас делаете, кажется странным — вы объединяете две операции cmd, а также передаете файл в качестве параметра этому. Я бы посоветовал батник и просто указать путь к нему в значении command.   -  person Rudolfs Bundulis    schedule 08.09.2016
comment
@RudolfsBundulis: Хорошая идея. Я попробую.   -  person Yulong Ao    schedule 09.09.2016


Ответы (1)


Как сказал Рудольфс Бундулис, создайте пакетный файл и просто вызовите его, внутри него сделайте все, что вам нужно сделать.

tasks.json:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "0.1.0",
    "command": "build.bat",
    "isShellCommand": true,
    "args": [],
    "showOutput": "always"    
}

И в вашем проекте есть добро build.bat.

build.bat:

@echo off
call "E:\programs\VS2015\VC\vcvarsall.bat" x64      <----- update your path to vcvarsall.bat

..
cl %YourCompilerFlags% main.cpp %YourLinkerFlags%
..

Я хотел бы упомянуть, что вы хотели бы иметь еще один пакет загрузчика кода Visual Studio, который устанавливал бы среду vcvars, а затем запускал редактор, чтобы вы не устанавливали vcvars для каждой сборки. Вот так:

@echo off
call "E:\programs\VS2015\VC\vcvarsall.bat" x64      <----- update your path to vcvarsall.bat

code

Таким образом, вы можете не устанавливать vcvarsall.bat каждый раз при компиляции кода. Флаг минимального перестроения также очень поможет вам, так что вы будете компилировать только измененные файлы.

person androidu    schedule 23.09.2016
comment
Я столкнулся с той же проблемой, что и ОП. Но как вы можете создать загрузчик для vs-кода, который вы упомянули выше? - person MafiaSkafia; 29.06.2019
comment
@MafiaSkafia это просто, этот загрузчик - это просто пакетный файл с этим содержимым, скопированным внутри него. этот сценарий — это сценарий, который вы хотите запустить вместо исполняемого файла vscode. - person androidu; 30.06.2019