尝试编译一个简单的hello world c ++程序时遇到问题.
#include <iostream>
int main()
{
std::cout << "hello world" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其中的错误是:
无法打开源文件"errno.h"
使用console(c:\> dir errno.h /s)快速搜索显示该文件位于多个目录中:
C:\ LegacyApp\VisualStudio2013\VC\crt\src
C:\ LegacyApp\VisualStudio2013\VC\include
C:\ Program Files(x86)\ Microsoft Visual Studio 11.0\VC\crt\src
C:\ Program Files(x86)\ Microsoft Visual Studio 11.0\VC\include
C:\ Program Files(x86)\ Windows Kits\10\Include\10.0.10150.0\ucrt
我的项目默认属性包括以下宏:
$(VC_IncludePath);$(WindowsSDK_IncludePath);
这解析为:
C:\ LegacyApp\VisualStudio2015\VC\include
C:\ LegacyApp\VisualStudio2015\VC\atlmfc\include
C:\ Program Files(x86)\ Windows Kits\10\Include\10.0.10240.0\ucrt
C:\程序文件(x86)\ Windows Kits\8.1 \包含\ um
C:\ Program Files(x86)\ Windows Kits\8.1\Include\shared
C:\ Program Files(x86)\ Windows Kits\8.1\Include\winrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt …
在尝试评估Windows上的Clang时,利用Windows通用C运行时(...\Windows Kits\10\Include\10.0.15063.0\ucrt),我立即面临意外的墙,形式是未公开和意外的依赖在微软的Visual Studio上.显然,即使是最简单的C程序也只有在包含任何标准C头时才能编译,因为它们似乎最终都试图#include vcruntime.h(它不是UCRT的一部分).
我的问题是:
我的理解是(除了从VS2015切换到VS2017的明显例外),Microsoft使ABI在每个版本的Visual C++工具链之间进行了重大更改.因此,如果我想分发库的二进制版本,我必须为我想要支持的每个新版本的VS分发一个单独的版本.
现在我的问题是:
如果这是相关的,我会满足于特定于Win10的答案,但我也对所有Windows版本感兴趣,因为(包括)Win7.我感兴趣的VS Studio的版本是VS2013/15/17,并且 - 就任何预测而言 - 将来的版本.
我希望能够使用 mingw-w64 来构建链接到 Visual Studio 2015+ 可用的通用 CRT 的二进制文件,而不是 MSVCRT.lib。mingw-w64 v6.0.0的发行说明包括以下内容:“感谢 Martin Storsjö,大量添加支持 UCRT”
不幸的是,我的搜索没有显示有关如何使用此支持的文档。
有谁知道我需要提供哪些选项以及在哪里提供它们?