Makefile возвращает ошибку, когда я пытаюсь использовать cl.exe как компилятор

#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; ).