使用 MSVC 从 Windows Powershell 编译 C 程序
Compile C Programs from Windows Powershell with MSVC
编辑:任何有兴趣这样做的人,请看下面我的回答。我完全按照我希望的那样工作了。
我知道这是一个以前可能已经解决过的话题,但我似乎无法在我所做的搜索中找到一个直接的答案,一切都非常令人费解。
我正在尝试设置我的 Powershell,以便我可以直接从 Powershell 终端编译简单的 C 程序,而不需要使用 Visual Studio 或他们一直推荐的“开发人员控制台”。
到目前为止,我已经安装了 Visual Studio 构建工具,因为我试图避免下载整个 Visual Studio IDE。我能够使用开发人员控制台编译一个 Hello World C 程序作为测试,以确保一切正常,并且编译正常 运行。但是我希望能够 运行 cl.exe 直接从 Powershell 不使用开发者控制台。
我设法在 Windows 系统属性中的环境变量中添加了一个文件夹,并成功地让 Powershell 识别了 cl 命令并向我展示了这个:
usage: cl [ option... ] filename... [ /link linkoption... ]
我觉得我离这里很近了,但是当我实际尝试 运行 "cl hello.c" 来编译我的小测试程序时,我得到了这个错误:
hello.c(1): fatal error C1034: stdio.h: no include path set
我在环境变量路径部分添加了文件夹“C:\Program Files (x86)\Microsoft Visual Studio19\BuildTools\VC\Tools\MSVC.29.30133\bin\Hostx86\x64”,但我注意到有多个 cl.exe 个文件在不同的文件夹中。
谁能告诉我如何拨入这个东西,这样我才能真正让 cl 功能在 Powershell 中完全发挥作用?在此先感谢您对此提供的任何帮助。
P.S。
我安装了 WSL 并且有多个可以使用 gcc 编译器的 Raspberry Pi,但这不是我的目标。我也知道 MinGW 和 Cygwin 之类的东西,但我不想使用这些解决方案。我正在尝试让这个特定场景起作用:在没有开发人员控制台的情况下在 Powershell 中使用 cl 命令。它不会那么难,我觉得我已经很接近了,只需要再添加一些环境变量或其他东西。
这是我在 PowerShell 中尝试 cl 命令及其给出的错误的屏幕截图。
https://imgur.com/a/vI6oYK2
打开 Visual Studio 开发者命令提示符。假设它默认为您的 %VSINSTALLDIR%,然后在该树中搜索 vcvars.bat
。
如果查看该文件,您会发现需要设置 INCLUDE
、LIB
和 PATH
才能使 command-line 构建正常工作。
特别是 C/C++ 运行时的“C”部分实际上在 Windows 10 SDK 中:
c:\Program Files (x86)\Windows Kits\Include\<version>\ucrt
为 headers
C:\Program Files (x86)\Windows Kits\Lib\<version>\ucrt\<arch>
用于图书馆。
参见 Microsoft Docs。
因为 Visual Studio 支持许多 side-by-side 工具集,编译器和 VC 运行时以及 include/libs 的“C++”部分位于:C:\Program Files (x86)\Microsoft Visual Studio17\<VSEdition>\VC\Tools\MSVC\<toolset>
在 bin
、include
和 lib/<arch>
文件夹中,应将其设置为上述环境变量的一部分。
例如,对于使用 Windows 10 SDK (17763) 的 VS 2017 (15.9) 企业版,将是:
MS-DOS 命令提示语法:
set INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Tools\MSVC.16.27023\include;
C:\Program Files (x86)\Windows Kits\include.0.17763.0\ucrt;
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared;
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um;
C:\Program Files (x86)\Windows Kits\include.0.17763.0\winrt;
C:\Program Files (x86)\Windows Kits\include.0.17763.0\cppwinrt
Powershell 语法是:
$env:INCLUDE = 'C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Tools\MSVC.16.27023\include;C:\Program Files (x86)\Windows Kits\include.0.17763.0\ucrt;C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared;C:\Program Files (x86)\Windows Kits\include.0.17763.0\um;C:\Program Files (x86)\Windows Kits\include.0.17763.0\winrt;C:\Program Files (x86)\Windows Kits\include.0.17763.0\cppwinrt'
假设您正在创建一个 32 位 (x86) 程序:
MS-DOS 命令提示符:
set LIB=C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Tools\MSVC.16.27023\lib\x86;
C:\Program Files (x86)\Windows Kits\lib.0.17763.0\ucrt\x86;
C:\Program Files (x86)\Windows Kits\lib.0.17763.0\um\x86;
PowerShell:
$env:LIB = 'C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Tools\MSVC.16.27023\lib\x86;C:\Program Files (x86)\Windows Kits\lib.0.17763.0\ucrt\x86;C:\Program Files (x86)\Windows Kits\lib.0.17763.0\um\x86;'
This should be sufficient for classic Win32 desktop development. For C++/CX, Managed C++, and/or UWP development you would need additional directories and the LIBPATH
variable set.
并且您希望编译器本身是一个 32 位 (x86) EXE:
MS-DOS 命令提示符:
set PATH=C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Tools\MSVC.16.27023\bin\HostX86\x86;
C:\Program Files (x86)\Windows Kits\bin.0.17763.0\x86;
C:\Program Files (x86)\Windows Kits\bin\x86;
%PATH%
PowerShell:
$env:PATH='C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Tools\MSVC.16.27023\bin\HostX86\x86;C:\Program Files (x86)\Windows Kits\bin.0.17763.0\x86;C:\Program Files (x86)\Windows Kits\bin\x86;' + $env:PATH
VS 2019 16.11.3 带 Windows SDK (19041)
$env:INCLUDE = 'C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\VC\Tools\MSVC.29.30133\include;C:\Program Files (x86)\Windows Kits\include.0.19041.0\ucrt;C:\Program Files (x86)\Windows Kits\include.0.19041.0\shared;C:\Program Files (x86)\Windows Kits\include.0.19041.0\um;C:\Program Files (x86)\Windows Kits\include.0.19041.0\winrt;C:\Program Files (x86)\Windows Kits\include.0.19041.0\cppwinrt'
$env:LIB = 'C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\VC\Tools\MSVC.29.30133\lib\x86;C:\Program Files (x86)\Windows Kits\lib.0.19041.0\ucrt\x86;C:\Program Files (x86)\Windows Kits\lib.0.19041.0\um\x86;'
$env:PATH='C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\VC\Tools\MSVC.29.30133\bin\HostX86\x86;C:\Program Files (x86)\Windows Kits\bin.0.19041.0\x86;C:\Program Files (x86)\Windows Kits\bin\x86;' + $env:PATH
Change Enterprise
to the appropriate SKU: Community
, Professional
, Enterprise
, or BuildTools
最好的答案是使用 Visual Studio 附带的开发人员提示,因为它设置了工具所需的所有环境变量。但是,如果你坚持手工完成所有事情,这就是我需要做的。
在我的 windows 系统上打开命令提示符并键入 cl
我得到 cl
未被识别为内部或外部命令。这里的问题是 cl.exe
不在我的路径上。我可以修改path环境变量,让shell能找到cl.exe
。在我的系统上,这是通过
>set PATH="C:\VS2019\VC\Tools\MSVC.29.30037\bin\Hostx64\x64";%PATH%
这会将 cl
的路径添加到我的 PATH 中。请注意,这仅适用于我正在使用的终端。一旦成功,您可以通过环境变量对其进行设置,以便它在所有命令提示符中持久存在并可用。
一旦 cl
在我的路径中,我就可以尝试编译以下简单程序:
#include <stdio.h>
#include <stdlib.>
int main(int argc, char** argv)
{
printf("Hello World\n");
return 0;
}
我收到 C1034 的问候:stdio.h 未设置包含路径。这意味着尽管编译器有一组内置的目录来查找包含文件,但它找不到 stdio.h。解决方案是我需要告诉它去哪里看。
现在在我的系统上我可以在“C:\Windows Kits\Include.0.190410\ucrt”找到它。 (路径将特定于我的安装,您需要在您的系统上找到每个文件)。
现在我可以使用 /I(包含搜索路径)选项 [1] 告诉编译器在哪里可以找到该文件。执行以下命令
cl /I"C:\Windows Kits\Include.0.19041.0\ucrt hello.c
出现错误“C1083:无法打开包含文件:'vcruntime.h'。我的硬盘驱动器的另一次搜索显示该文件位于“C:\VS2019\VC\Tools\MSVC.29.30037\include”,并执行以下命令
cl /I"C:\Windows Kits\Include.0.19041.0\ucrt"/I"C:\VS2019\VC\Tools\MSVC.29.30037\include" hello.c
稍微扩展上面的命令来进行编译,我们可以使用以下命令
cl /c /I"C:\Windows Kits\Include.0.19041.0\ucrt"/I"C:\VS2019\VC\Tools\MSVC.29.30037\include" hello.c /Fo hello.o
生成目标文件hello.o
。
现在开始 linking。 Microsoft linker 称为 LINK[2] 并以
开头
LINK hello.o /OUT:hello.exe
报错“LNK1104: cannot open file 'LIBCMT.lib'”。这就是进步,我已经通过了编译阶段,进入了link阶段,我只需要告诉编译器去哪里找到图书馆。
我的硬盘驱动器的另一次搜索显示图书馆位于
"C:\VS2019\VC\Tools\MSVC.29.30037\lib\x64",和运行下面的命令,
LINK hello.o /LIBPATH:"C:\VS2019\VC\Tools\MSVC.29.30037\lib\x64" /OUT:hello.exe
出现错误 LNK1104:无法打开文件“kernel32.lib”,我在“C:\Windows Kits\lib.0.19041.0\um\x64”找到了该文件
我还必须添加“C:\Windows Kits\lib.0.19041.0\ucrt\x64”,以解析 libucrt.lib”。以下命令
LINK hello.o /LIBPATH:"C:\VS2019\VC\Tools\MSVC.29.30037\lib\x64" /LIBPATH:"C:\Windows Kits\lib.0.19041.0\um\x64" /LIBPATH:"C:\Windows Kits\lib.0.19041.0\ucrt\x64" /OUT:hello.exe
最终生成输出文件 hello.exe,这可以从命令提示符中得到。
请记住,以上内容适用于简单的 hello-world 风格的应用程序。随着程序变大,您需要指定的各种路径也会变大。您可能想研究使用 nmake
并使用 makefile 来管理您的构建。
[1]你可以用“cl/?”查看 Microsoft 编译器可用的所有命令行选项。
[2] 你可以使用“LINK /?”查看 Microsoft linker.
可用的所有命令行选项
好的,感谢 Chuck Walbourn,我解决了这个问题,请查看他的回答,看看我从哪里获得了所有适当的目录来完成这项工作。要将环境变量永久添加到您的系统,以便从任何 PowerShell 终端键入“cl”都可以工作,请使用 2019 版 Visual Studio Build Tools 对 Windows 10 执行以下操作(这可能适用于其他变体,但您必须相应地进行调整):
点击 Window 键并开始输入“环境变量”。您将看到“编辑系统环境变量”选项。单击“高级”选项卡右下角的“环境变量...”按钮。您将看到“用户变量名称”和“系统变量”部分。下一步假设您在本节中没有看到“Include”和“Lib”的变量。在系统变量部分下,点击“新建...”并将变量命名为 Include,对于变量值,输入:
C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\VC\Tools\MSVC.29.30133\include;C:\Program Files (x86)\Windows Kits\include.0.19041.0\ucrt;C:\Program Files (x86)\Windows Kits\include.0.19041.0\shared;C:\Program Files (x86)\Windows Kits\include.0.19041.0\um;C:\Program Files (x86)\Windows Kits\include.0.19041.0\winrt;C:\Program Files (x86)\Windows Kits\include.0.19041.0\cppwinrt
确保检查这些文件夹是否确实存在于您的系统中,并相应地调整版本号和“企业”。我不得不将“Enterprise”更改为“BuildTools”。
接下来创建一个名为“Lib”的新变量并输入以下内容:
C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\VC\Tools\MSVC.29.30133\lib\x86;C:\Program Files (x86)\Windows Kits\lib.0.19041.0\ucrt\x86;C:\Program Files (x86)\Windows Kits\lib.0.19041.0\um\x86
同样的规则适用,确保调整这些目录以匹配您的 Visual Studio 安装目录。
最后,假设它为我做的 Path 变量已经存在,双击“Path”并通过点击弹出的 Path 菜单中的 New 按钮一个接一个地添加以下键:
C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\VC\Tools\MSVC.29.30133\bin\HostX86\x86
C:\Program Files (x86)\Windows Kits\bin.0.19041.0\x86
C:\Program Files (x86)\Windows Kits\bin\x86
调整目录以匹配您的系统,如果需要,调整 x86 与 x64 目录(我只使用 x86)。
Here is an image 突出显示本 post 中提到的一些相关 windows 和按钮。希望任何弄乱这些东西的人都能弄清楚细节。做所有这一切需要您自担风险,我不知道如果出现问题,这是否会以某种方式控制您的系统。
如果一切顺利,您应该可以在 .c 文件的目录中打开 PowerShell,然后键入:
cl filename.c
并且系统会输出filename.obj和filename.exe
成功!再次感谢 Chuck 提供的所有帮助,并感谢 thurizas 的贡献和提供另一种可能的解决方案。
编辑:任何有兴趣这样做的人,请看下面我的回答。我完全按照我希望的那样工作了。
我知道这是一个以前可能已经解决过的话题,但我似乎无法在我所做的搜索中找到一个直接的答案,一切都非常令人费解。
我正在尝试设置我的 Powershell,以便我可以直接从 Powershell 终端编译简单的 C 程序,而不需要使用 Visual Studio 或他们一直推荐的“开发人员控制台”。
到目前为止,我已经安装了 Visual Studio 构建工具,因为我试图避免下载整个 Visual Studio IDE。我能够使用开发人员控制台编译一个 Hello World C 程序作为测试,以确保一切正常,并且编译正常 运行。但是我希望能够 运行 cl.exe 直接从 Powershell 不使用开发者控制台。
我设法在 Windows 系统属性中的环境变量中添加了一个文件夹,并成功地让 Powershell 识别了 cl 命令并向我展示了这个:
usage: cl [ option... ] filename... [ /link linkoption... ]
我觉得我离这里很近了,但是当我实际尝试 运行 "cl hello.c" 来编译我的小测试程序时,我得到了这个错误:
hello.c(1): fatal error C1034: stdio.h: no include path set
我在环境变量路径部分添加了文件夹“C:\Program Files (x86)\Microsoft Visual Studio19\BuildTools\VC\Tools\MSVC.29.30133\bin\Hostx86\x64”,但我注意到有多个 cl.exe 个文件在不同的文件夹中。
谁能告诉我如何拨入这个东西,这样我才能真正让 cl 功能在 Powershell 中完全发挥作用?在此先感谢您对此提供的任何帮助。
P.S。 我安装了 WSL 并且有多个可以使用 gcc 编译器的 Raspberry Pi,但这不是我的目标。我也知道 MinGW 和 Cygwin 之类的东西,但我不想使用这些解决方案。我正在尝试让这个特定场景起作用:在没有开发人员控制台的情况下在 Powershell 中使用 cl 命令。它不会那么难,我觉得我已经很接近了,只需要再添加一些环境变量或其他东西。
这是我在 PowerShell 中尝试 cl 命令及其给出的错误的屏幕截图。 https://imgur.com/a/vI6oYK2
打开 Visual Studio 开发者命令提示符。假设它默认为您的 %VSINSTALLDIR%,然后在该树中搜索 vcvars.bat
。
如果查看该文件,您会发现需要设置 INCLUDE
、LIB
和 PATH
才能使 command-line 构建正常工作。
特别是 C/C++ 运行时的“C”部分实际上在 Windows 10 SDK 中:
c:\Program Files (x86)\Windows Kits\Include\<version>\ucrt
为 headersC:\Program Files (x86)\Windows Kits\Lib\<version>\ucrt\<arch>
用于图书馆。
参见 Microsoft Docs。
因为 Visual Studio 支持许多 side-by-side 工具集,编译器和 VC 运行时以及 include/libs 的“C++”部分位于:C:\Program Files (x86)\Microsoft Visual Studio17\<VSEdition>\VC\Tools\MSVC\<toolset>
在 bin
、include
和 lib/<arch>
文件夹中,应将其设置为上述环境变量的一部分。
例如,对于使用 Windows 10 SDK (17763) 的 VS 2017 (15.9) 企业版,将是:
MS-DOS 命令提示语法:
set INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Tools\MSVC.16.27023\include;
C:\Program Files (x86)\Windows Kits\include.0.17763.0\ucrt;
C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared;
C:\Program Files (x86)\Windows Kits\include.0.17763.0\um;
C:\Program Files (x86)\Windows Kits\include.0.17763.0\winrt;
C:\Program Files (x86)\Windows Kits\include.0.17763.0\cppwinrt
Powershell 语法是:
$env:INCLUDE = 'C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Tools\MSVC.16.27023\include;C:\Program Files (x86)\Windows Kits\include.0.17763.0\ucrt;C:\Program Files (x86)\Windows Kits\include.0.17763.0\shared;C:\Program Files (x86)\Windows Kits\include.0.17763.0\um;C:\Program Files (x86)\Windows Kits\include.0.17763.0\winrt;C:\Program Files (x86)\Windows Kits\include.0.17763.0\cppwinrt'
假设您正在创建一个 32 位 (x86) 程序:
MS-DOS 命令提示符:
set LIB=C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Tools\MSVC.16.27023\lib\x86;
C:\Program Files (x86)\Windows Kits\lib.0.17763.0\ucrt\x86;
C:\Program Files (x86)\Windows Kits\lib.0.17763.0\um\x86;
PowerShell:
$env:LIB = 'C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Tools\MSVC.16.27023\lib\x86;C:\Program Files (x86)\Windows Kits\lib.0.17763.0\ucrt\x86;C:\Program Files (x86)\Windows Kits\lib.0.17763.0\um\x86;'
This should be sufficient for classic Win32 desktop development. For C++/CX, Managed C++, and/or UWP development you would need additional directories and the
LIBPATH
variable set.
并且您希望编译器本身是一个 32 位 (x86) EXE:
MS-DOS 命令提示符:
set PATH=C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Tools\MSVC.16.27023\bin\HostX86\x86;
C:\Program Files (x86)\Windows Kits\bin.0.17763.0\x86;
C:\Program Files (x86)\Windows Kits\bin\x86;
%PATH%
PowerShell:
$env:PATH='C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\VC\Tools\MSVC.16.27023\bin\HostX86\x86;C:\Program Files (x86)\Windows Kits\bin.0.17763.0\x86;C:\Program Files (x86)\Windows Kits\bin\x86;' + $env:PATH
VS 2019 16.11.3 带 Windows SDK (19041)
$env:INCLUDE = 'C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\VC\Tools\MSVC.29.30133\include;C:\Program Files (x86)\Windows Kits\include.0.19041.0\ucrt;C:\Program Files (x86)\Windows Kits\include.0.19041.0\shared;C:\Program Files (x86)\Windows Kits\include.0.19041.0\um;C:\Program Files (x86)\Windows Kits\include.0.19041.0\winrt;C:\Program Files (x86)\Windows Kits\include.0.19041.0\cppwinrt'
$env:LIB = 'C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\VC\Tools\MSVC.29.30133\lib\x86;C:\Program Files (x86)\Windows Kits\lib.0.19041.0\ucrt\x86;C:\Program Files (x86)\Windows Kits\lib.0.19041.0\um\x86;'
$env:PATH='C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\VC\Tools\MSVC.29.30133\bin\HostX86\x86;C:\Program Files (x86)\Windows Kits\bin.0.19041.0\x86;C:\Program Files (x86)\Windows Kits\bin\x86;' + $env:PATH
Change
Enterprise
to the appropriate SKU:Community
,Professional
,Enterprise
, orBuildTools
最好的答案是使用 Visual Studio 附带的开发人员提示,因为它设置了工具所需的所有环境变量。但是,如果你坚持手工完成所有事情,这就是我需要做的。
在我的 windows 系统上打开命令提示符并键入 cl
我得到 cl
未被识别为内部或外部命令。这里的问题是 cl.exe
不在我的路径上。我可以修改path环境变量,让shell能找到cl.exe
。在我的系统上,这是通过
>set PATH="C:\VS2019\VC\Tools\MSVC.29.30037\bin\Hostx64\x64";%PATH%
这会将 cl
的路径添加到我的 PATH 中。请注意,这仅适用于我正在使用的终端。一旦成功,您可以通过环境变量对其进行设置,以便它在所有命令提示符中持久存在并可用。
一旦 cl
在我的路径中,我就可以尝试编译以下简单程序:
#include <stdio.h>
#include <stdlib.>
int main(int argc, char** argv)
{
printf("Hello World\n");
return 0;
}
我收到 C1034 的问候:stdio.h 未设置包含路径。这意味着尽管编译器有一组内置的目录来查找包含文件,但它找不到 stdio.h。解决方案是我需要告诉它去哪里看。
现在在我的系统上我可以在“C:\Windows Kits\Include.0.190410\ucrt”找到它。 (路径将特定于我的安装,您需要在您的系统上找到每个文件)。
现在我可以使用 /I(包含搜索路径)选项 [1] 告诉编译器在哪里可以找到该文件。执行以下命令
cl /I"C:\Windows Kits\Include.0.19041.0\ucrt hello.c
出现错误“C1083:无法打开包含文件:'vcruntime.h'。我的硬盘驱动器的另一次搜索显示该文件位于“C:\VS2019\VC\Tools\MSVC.29.30037\include”,并执行以下命令
cl /I"C:\Windows Kits\Include.0.19041.0\ucrt"/I"C:\VS2019\VC\Tools\MSVC.29.30037\include" hello.c
稍微扩展上面的命令来进行编译,我们可以使用以下命令
cl /c /I"C:\Windows Kits\Include.0.19041.0\ucrt"/I"C:\VS2019\VC\Tools\MSVC.29.30037\include" hello.c /Fo hello.o
生成目标文件hello.o
。
现在开始 linking。 Microsoft linker 称为 LINK[2] 并以
开头LINK hello.o /OUT:hello.exe
报错“LNK1104: cannot open file 'LIBCMT.lib'”。这就是进步,我已经通过了编译阶段,进入了link阶段,我只需要告诉编译器去哪里找到图书馆。
我的硬盘驱动器的另一次搜索显示图书馆位于 "C:\VS2019\VC\Tools\MSVC.29.30037\lib\x64",和运行下面的命令,
LINK hello.o /LIBPATH:"C:\VS2019\VC\Tools\MSVC.29.30037\lib\x64" /OUT:hello.exe
出现错误 LNK1104:无法打开文件“kernel32.lib”,我在“C:\Windows Kits\lib.0.19041.0\um\x64”找到了该文件 我还必须添加“C:\Windows Kits\lib.0.19041.0\ucrt\x64”,以解析 libucrt.lib”。以下命令
LINK hello.o /LIBPATH:"C:\VS2019\VC\Tools\MSVC.29.30037\lib\x64" /LIBPATH:"C:\Windows Kits\lib.0.19041.0\um\x64" /LIBPATH:"C:\Windows Kits\lib.0.19041.0\ucrt\x64" /OUT:hello.exe
最终生成输出文件 hello.exe,这可以从命令提示符中得到。
请记住,以上内容适用于简单的 hello-world 风格的应用程序。随着程序变大,您需要指定的各种路径也会变大。您可能想研究使用 nmake
并使用 makefile 来管理您的构建。
[1]你可以用“cl/?”查看 Microsoft 编译器可用的所有命令行选项。
[2] 你可以使用“LINK /?”查看 Microsoft linker.
可用的所有命令行选项好的,感谢 Chuck Walbourn,我解决了这个问题,请查看他的回答,看看我从哪里获得了所有适当的目录来完成这项工作。要将环境变量永久添加到您的系统,以便从任何 PowerShell 终端键入“cl”都可以工作,请使用 2019 版 Visual Studio Build Tools 对 Windows 10 执行以下操作(这可能适用于其他变体,但您必须相应地进行调整):
点击 Window 键并开始输入“环境变量”。您将看到“编辑系统环境变量”选项。单击“高级”选项卡右下角的“环境变量...”按钮。您将看到“用户变量名称”和“系统变量”部分。下一步假设您在本节中没有看到“Include”和“Lib”的变量。在系统变量部分下,点击“新建...”并将变量命名为 Include,对于变量值,输入:
C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\VC\Tools\MSVC.29.30133\include;C:\Program Files (x86)\Windows Kits\include.0.19041.0\ucrt;C:\Program Files (x86)\Windows Kits\include.0.19041.0\shared;C:\Program Files (x86)\Windows Kits\include.0.19041.0\um;C:\Program Files (x86)\Windows Kits\include.0.19041.0\winrt;C:\Program Files (x86)\Windows Kits\include.0.19041.0\cppwinrt
确保检查这些文件夹是否确实存在于您的系统中,并相应地调整版本号和“企业”。我不得不将“Enterprise”更改为“BuildTools”。
接下来创建一个名为“Lib”的新变量并输入以下内容:
C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\VC\Tools\MSVC.29.30133\lib\x86;C:\Program Files (x86)\Windows Kits\lib.0.19041.0\ucrt\x86;C:\Program Files (x86)\Windows Kits\lib.0.19041.0\um\x86
同样的规则适用,确保调整这些目录以匹配您的 Visual Studio 安装目录。
最后,假设它为我做的 Path 变量已经存在,双击“Path”并通过点击弹出的 Path 菜单中的 New 按钮一个接一个地添加以下键:
C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise\VC\Tools\MSVC.29.30133\bin\HostX86\x86
C:\Program Files (x86)\Windows Kits\bin.0.19041.0\x86
C:\Program Files (x86)\Windows Kits\bin\x86
调整目录以匹配您的系统,如果需要,调整 x86 与 x64 目录(我只使用 x86)。
Here is an image 突出显示本 post 中提到的一些相关 windows 和按钮。希望任何弄乱这些东西的人都能弄清楚细节。做所有这一切需要您自担风险,我不知道如果出现问题,这是否会以某种方式控制您的系统。
如果一切顺利,您应该可以在 .c 文件的目录中打开 PowerShell,然后键入:
cl filename.c
并且系统会输出filename.obj和filename.exe
成功!再次感谢 Chuck 提供的所有帮助,并感谢 thurizas 的贡献和提供另一种可能的解决方案。