【问题标题】:Unable to compile and link simple C++ program with Visual Studio 2015 command line tools无法使用 Visual Studio 2015 命令行工具编译和链接简单的 C++ 程序
【发布时间】:2015-12-29 08:51:16
【问题描述】:

使用 Visual Studio 2015,我不再能够使用命令行工具编译和链接简单的 C++ 程序。

考虑 main.cpp:

#include <stdlib.h>
int main() { return 0; }

在以前的版本(例如 Visual Studio 2012)中,我能够轻松编译和链接 main.cpp:

C:\Users\bkircher\src\test>cl main.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.61030 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
Microsoft (R) Incremental Linker Version 11.00.61030.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:main.exe
main.obj

完成了。

但是,使用 Visual Studio 2015,我不再设置正确的 CRT 包含和库路径:

C:\Users\bkircher\src\test>cl main.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23026 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

main.cpp
main.cpp(1): fatal error C1083: Cannot open include file: 'stdlib.h': No such file or directory

我了解 Microsoft 将 C 运行时作为新的 Windows 操作系统组件通用 CRT 分发。

Introducing the Universal CRT 中所述,我应该使用以下 MSBuild 属性来找到合适的路径

$(UniversalCRT_IncludePath)
$(UniversalCRT_LibraryPath_x64)

尽管如此,我如何获得正确的库并包含除 devenv 或 MSBuild 之外的构建系统的路径?

为了它:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>set include
INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\INCLUDE;C:\Program Files (x86)\Windows Kits\10\include\wdf\ucrt;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\include\um;C:\Program Files (x86)\Windows Kits\10\include\wdf\shared;C:\Program Files (x86)\Windows Kits\10\include\wdf\um;C:\Program Files (x86)\Windows Kits\10\include\wdf\winrt;

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>set lib
LIB=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\LIB\amd64;C:\Program Files (x86)\Windows Kits\10\lib\wdf\ucrt\x64;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6\lib\um\x64;C:\Program Files (x86)\Windows Kits\10\lib\wdf\um\x64;
LIBPATH=C:\Windows\Microsoft.NET\Framework64\v4.0.30319;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\LIB\amd64;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\LIB\amd64;C:\Program Files (x86)\Windows Kits\10\UnionMetadata;C:\Program Files (x86)\Windows Kits\10\References;C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.UniversalApiContract\1.0.0.0;C:\Program Files (x86)\Windows Kits\10\References\Windows.Foundation.FoundationContract\1.0.0.0;C:\Program Files (x86)\Windows Kits\10\References\indows.Networking.Connectivity.WwanContract\1.0.0.0;C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs\14.0\References\CommonConfiguration\neutral;

【问题讨论】:

    标签: c++ cmd visual-studio-2015 crt


    【解决方案1】:

    包含环境变量的内容是个好主意。根据那里出现的路径,您似乎已经安装了 Windows 驱动程序工具包并且您遇到了这个issue reported on Connect

    根据问题描述,WDK 创建的wdf 目录混淆了试图确定最新可用SDK 版本的批处理文件。例如,而不是

    C:\Program Files (x86)\Windows Kits\10\include\wdf\ucrt
    

    INCLUDE 变量中,你应该有类似

    C:\Program Files (x86)\Windows Kits\10\include\10.0.10150.0\ucrt
    

    “地毯式轰炸”解决方案:卸载 WDK,确保 wdf 目录消失,一切应恢复正常。


    如果这不是一个选项,这里有一个“手术”解决方案:您需要编辑

    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vcvarsqueryregistry.bat"
    

    (当然是先备份)

    1.查找以下两个标签:

    :GetWindowsSdkDirHelper32
    :GetWindowsSdkDirHelper64
    

    在它们下,你会发现下面一行:

    @REM Get windows 10 sdk version number
    @if not "%WindowsSdkDir%"=="" @FOR /F "delims=" %%i IN ('dir "%WindowsSdkDir%include\" /b /ad-h /on') DO @set WindowsSDKVersion=%%i\
    

    改成:

    @REM Get windows 10 sdk version number
    @if not "%WindowsSdkDir%"=="" @FOR /F "delims=" %%i IN ('dir "%WindowsSdkDir%include\" /b /ad-h /on') DO (
       @if not "%%i"=="wdf" (
          @set WindowsSDKVersion=%%i\
       )
    )
    

    2.查找以下两个标签:

    :GetUniversalCRTSdkDirHelper32
    :GetUniversalCRTSdkDirHelper64
    

    在每一个下,更改以下行:

    @FOR /F "delims=" %%i IN ('dir "%UniversalCRTSdkDir%include\" /b /ad-h /on') DO @SET UCRTVersion=%%i
    

    到:

    @FOR /F "delims=" %%i IN ('dir "%UniversalCRTSdkDir%include\" /b /ad-h /on') DO (
       @if not "%%i"=="wdf" (
          @SET UCRTVersion=%%i
       )
    )
    

    就是这样。如果有帮助,请告诉我。

    请记住,这将完全跳过 wdf 目录。如果 WDK 命令提示设置脚本碰巧使用相同的 vcvarsqueryregistry.bat 批处理文件(我对此表示怀疑,但是...),那么它们将无法正常工作;在这种情况下,需要更多的技巧来为每个构建环境选择合适的批处理文件。

    【讨论】:

    • 感谢您的链接和提供的解决方案。你的分析是正确的。我确实卸载了 Windows SDK 和 Windows 驱动程序工具包,一切都再次像魅力一样运行
    • Let me know if it helped. 谢谢,它有助于不卸载 WDK。
    • 还要注意在上述答案中链接的 Microsoft 网站上发布的解决方法。隐藏 wdf 文件夹也可以解决这个问题。
    • 我有同样的情况,但我的 vcvarsqueryregistry.bat 没有上面提到的标签。 Windows 7,VS 2015 Professional,我已经卸载了 Windows Driver Kit。命令行仍然没有运气。
    • @Bruce 你似乎有一个更新版本的 VS 2015(更新之一),上面的问题应该得到解决。 3264 标签已统一为 GetUniversalCRTSdkDirHelper(对于 Windows SDK 也是如此)。如果我正确阅读了更新的脚本,它应该会跳过include 下不以10. 开头的目录,因此wdf 目录不应该影响结果。我会尝试查看生成的 INCLUDE 以找出错误路径的来源。
    猜你喜欢
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2017-01-02
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多