У меня очень странное поведение, старый командный файл хорошо работает под 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





Предварительные замечания:
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 с помощью [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 (и ссылка на сайт) (msdn.microsoft.com/en-us/library/fwkeyyhe.aspx). Я предполагаю, что необходим /MD -DNDEBUG (также проверьте /MT) или сделайте это через make-файлы. Или, что еще проще, создайте решение и проект VStudio (который должен установить для этих флагов значения по умолчанию) и вызвать для него девенв (docs.microsoft.com/en-us/visualstudio/ide/reference/…). Но это может стать темой для другого вопроса (если он еще не существует). А пока отметьте этот ответ как решение вашего вопроса, чтобы другие пользователи знали об этом.
Как мне отметить этот ответ как решение моего вопроса?
Этот метод работает отлично.Как собрать эту релизную версию консольной программы с помощью параметра CL в пакетном файле? Вроде только VS IDE ставить можно?