Инструменты командной строки Visual Studio 2017 не работают при запуске из пакетного файла

У меня очень странное поведение, старый командный файл хорошо работает под Windows XP. Почему не работает при компиляции простого файла, такого как hello.c, в (Vs2017 + Win10) пакетным файлом в окне cmd?

Когда я понял, что Win10 имеет новую политику безопасности, я прочитал несколько статей на сайте Microsoft. Они рекомендуют использовать окно командной строки разработчика для компиляции из командной строки.

Действительно, ручное управление работает хорошо. Но когда я вошел в Win10 как суперадминистратор и попытался запустить все через командный файл, это не сработало, просто закончил настройку среды.

При запуске команд из командного файла вручную все работает должным образом (исполняемый файл успешно сгенерирован). Что не так с этим?

Вот содержимое командного файла:

%comspec% /k "C:\Program Files(x86)\Microsoft Visual Studio\2017  \Community\VC\Auxiliary\Build\vcvars64.bat"
cd g:\testdir
g: 
cl TestBatFileCompile.c
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
0
1 049
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предварительные замечания:

  • vcvars64.bat просто вызывает vcvarsall.bat и передает ему аргумент x64, за которым следует свой собственный (если есть)
  • vcvarsall.bat в основном устанавливает некоторые переменные окружения (set VSCMD_DEBUG=3 перед его запуском, для подробного вывода), необходимые для работы инструментов сборки VStudio. Проверьте [MS.Docs]: Создайте код C / C++ в командной строке. для более подробной информации.

Я улучшил / упростил ваш пример для большей ясности:

script.bat:

@echo off

echo Running vcvars...
%comspec% /K "c:\Install\x86\Microsoft\Visual Studio Community\2017\VC\Auxiliary\Build\vcvarsall.bat" x64
echo Ran vcvars: %ERRORLEVEL%

echo Running cl...
cl /nologo dummy.c /link /NOLOGO
echo Ran cl: %ERRORLEVEL%

dummy.c:

int main() {
    return 0;
}

Вывод:

e:\Work\Dev\StackOverflow\q053523085>dir /b
dummy.c
script.bat

e:\Work\Dev\StackOverflow\q053523085>script.bat
Running vcvars...
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.2
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'

e:\Work\Dev\StackOverflow\q053523085>rem HMMM, SOMETHING DOESN'T SEEM QUITE RIGHT. LET'S TRY EXITING CMD...

e:\Work\Dev\StackOverflow\q053523085>exit
Ran vcvars: 0
Running cl...
'cl' is not recognized as an internal or external command,
operable program or batch file.
Ran cl: 9009

Что случилось?

  • cmd /K ([MS.Docs]: Cmd) открыл новый экземпляр cmd поверх существующего (используя то же окно)
    • vcvarsall был вызван в этом (2nd) экземпляре, выполнил свою работу и закончил, и кажется, что все осталось в воздухе
  • Но после ввода выход выясняется, что cl действительно запустился, но в экземпляре 1stcmd (в фоновом режиме, если хотите), и поскольку переменные не были ранее установлены vcvarsall, это не удалось

Чтобы все заработало, вызовите vcvarsall с помощью [MS.Docs]: звоните:

call "c:\Install\x86\Microsoft\Visual Studio Community\2017\VC\Auxiliary\Build\vcvarsall.bat" x64

Вывод (в новом окне cmd):

e:\Work\Dev\StackOverflow\q053523085>dir /b
dummy.c
script.bat

e:\Work\Dev\StackOverflow\q053523085>script.bat
Running vcvars...
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.2
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
Ran vcvars: 0
Running cl...
dummy.c
Ran cl: 0
e:\Work\Dev\StackOverflow\q053523085>dir /b
dummy.c
dummy.exe
dummy.obj
script.bat

Этот метод работает отлично.Как собрать эту релизную версию консольной программы с помощью параметра CL в пакетном файле? Вроде только VS IDE ставить можно?

user10716938 29.11.2018 02:55

Да, это установка некоторых параметров clссылка на сайт) (msdn.microsoft.com/en-us/library/fwkeyyhe.aspx). Я предполагаю, что необходим /MD -DNDEBUG (также проверьте /MT) или сделайте это через make-файлы. Или, что еще проще, создайте решение и проект VStudio (который должен установить для этих флагов значения по умолчанию) и вызвать для него девенв (docs.microsoft.com/en-us/visualstudio/ide/reference/…). Но это может стать темой для другого вопроса (если он еще не существует). А пока отметьте этот ответ как решение вашего вопроса, чтобы другие пользователи знали об этом.

CristiFati 29.11.2018 08:34

Как мне отметить этот ответ как решение моего вопроса?

user10716938 29.11.2018 08:53

Другие вопросы по теме