当我尝试使用 cl.exe 作为编译器时,Makefile returns 出错

Makefile returns an error when I try to use cl.exe as the compiler

我已经在我的 makefile 中激活了 vcvarsall.bat,但是当我尝试编译我的程序时仍然出现这个错误:

**********************************************************************
** 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:\Dev\LearningC++\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 Studio19\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
    @cl /Z7 /W3 C:\Dev\LearningC++\main.cpp

run:
    @bin\main.exe

当我手动输入命令时,代码确实被编译并且我生成了可以运行的可执行文件,但是我也从编译器收到了这些奇怪的警告消息:

C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MS
VC.29.30133\include\ostream(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>> &std::operator <<<std::char_t
raits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char
 *)' being compiled
Microsoft (R) Incremental Linker Version 14.29.30133.0
Copyright (C) Microsoft Corporation.  All rights reserved.

我正在使用 Windows 10.

在 makefile 配方中,每个命令行都是 运行 在它自己的 shell 中。 Windows中vcvarsall.bat文件设置了一堆环境变量,环境变量只对当前shell有效;当 shell 退出时,它们就消失了。当你 运行:

build: main.cpp
    @call "C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
    @cl /Z7 /W3 C:\Dev\LearningC++\main.cpp

首先 make 启动 shell 和 运行s call 在其中设置 Visual Studio 环境,然后 shell 退出和所有这些变量设置丢失。然后 make 开始另一个 shell 和 运行s cl 但是它想要的环境设置不再存在所以它失败了。

我认为在 Windows cmd.exe 中将多个命令放在一行中的方法是使用 & 因此您可以尝试像这样重写您的 makefile:

build: main.cpp
    @call "C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 \
      & cl /Z7 /W3 C:\Dev\LearningC++\main.cpp

(注意 call 行末尾的反斜杠,然后是 &)。