#c #makefile #cl.exe
Вопрос:
Я активировал vcvarsall.bat
в своем файле makefile, однако я все еще получаю эту ошибку при попытке компиляции своей программы:
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.11.1
** Copyright (c) 2021 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
process_begin: CreateProcess(NULL, cl /Z7 /W3 C:DevLearningC main.cpp
, ...) failed.
make (e=2): The system cannot find the file specified.
make: *** [build] Error 2
[Process exited 2]
Сделать файл:
all: build run
build: main.cpp
@call "C:Program Files (x86)Microsoft Visual Studio2019CommunityVCAuxiliaryBuildvcvarsall.bat" x64
@cl /Z7 /W3 C:DevLearningC main.cpp
run:
@binmain.exe
Когда я набираю команды вручную, код компилируется, и я создаю и выполняю исполняемый файл, который работает, однако я также получаю эти странные предупреждающие сообщения от компилятора:
C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMS
VC14.29.30133includeostream(746): warning C4530: C exception handler
used, but unwind semantics are not enabled. Specify /EHsc
main.cpp(4): note: see reference to function template instantiation 'std:
:basic_ostream<char,std::char_traits<char>> amp;std::operator <<<std::char_t
raits<char>>(std::basic_ostream<char,std::char_traits<char>> amp;,const char
*)' being compiled
Microsoft (R) Incremental Linker Version 14.29.30133.0
Copyright (C) Microsoft Corporation. All rights reserved.
Я использую Windows 10.
Комментарии:
1. Я удалил тег mingw, потому что, похоже, вы используете инструменты Visual Studio, а не инструменты MinGW.
2. И ваша
%PATH%
переменная содержит правильный каталог, в которомcl.exe
она установлена? Я боюсь, что вы предоставляете нам недостаточно информации, чтобы помочь в решении вашей проблемы.3. Работает ли это, если вы вводите команды вручную без файла makefile?
4. Да, это работает, если я набираю команды вручную, однако я получаю странное предупреждающее сообщение от компилятора. Я отредактировал вопрос и добавил туда дополнительную информацию.
Ответ №1:
В рецепте makefile каждая командная строка выполняется в своей собственной оболочке. В Windows vcvarsall.bat
файл устанавливает множество переменных среды, а переменные среды действуют только для текущей оболочки; при выходе из оболочки они исчезают. Когда ты бежишь:
build: main.cpp
@call "C:Program Files (x86)Microsoft Visual Studio2019CommunityVCAuxiliaryBuildvcvarsall.bat" x64
@cl /Z7 /W3 C:DevLearningC main.cpp
сначала make запускает оболочку и запускает call
в ней программу, которая задает среду Visual Studio, затем оболочка завершает работу, и все эти параметры переменных теряются. Затем make запускает другую оболочку и запускает cl
ее, но нужных параметров среды больше нет, поэтому она терпит неудачу.
Я думаю, что способ поместить несколько команд в одну строку в Windows cmd.exe
заключается в использовании amp;
, чтобы вы могли попробовать переписать свой файл makefile следующим образом:
build: main.cpp
@call "C:Program Files (x86)Microsoft Visual Studio2019CommunityVCAuxiliaryBuildvcvarsall.bat" x64
amp; cl /Z7 /W3 C:DevLearningC main.cpp
(обратите внимание на обратную косую черту в конце call
строки, затем на amp;
).