Visual Studio 2015在创建简单的测试控制台程序时给出了错误

时间:2015-07-31 00:41:33

标签: c++

这是我正在使用的代码。

#include "stdafx.h"
#include <iostream>

int main() {
    std::cout << "hi";

    return 0;
}

当我创建简单的c ++控制台应用程序并尝试构建它时,会发生以下错误:

cannot open include file 'stdio.h': No such file or directory

为什么呢?不应该将stdio.h作为标准库包含在内吗?我能做些什么来取回它?

编辑:我刚看了C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ include目录。没有stdio.h或stdafx.h。我真的不确定为什么。我怎样才能让他们回来?

10 个答案:

答案 0 :(得分:46)

那是因为 Visual studio 改变了C头的路径。

您有关于此的信息:https://blogs.msdn.microsoft.com/vcblog/2015/03/03/introducing-the-universal-crt/

我要解决的问题是:

转到bool parser::parse(list<symbol> const& myList){ // Will read tokens by type to make sure that they pass the parse auto lookAhead = myList.begin(); if (lookAhead != myList.end() && std::next(lookAhead) != myList.end()) ++lookAhead; for (auto it = myList.begin(); it != myList.end(); ++it){ if (it->type == "") { } } return true; } 。在Project->Properties->中添加Configuraton Properties->VC++ Diretories->Library Directories 的路径(选择您的体系结构)

C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10150.0\ucrt\中添加一条路径:

C/C++->General->Additional include directories
  

注意: 10.0.10150.0 可能因版本而异。

答案 1 :(得分:33)

我有一个类似的问题,将现有的C项目从Visual Studio 2013升级到VS2017(我跳过了VS2015);也没有找到任何标准标题。

接受的答案(由Cezar Azevedo de Faveri提供)确实对我有用,但是在设置中堵塞绝对路径是不优雅的,特别是考虑到有人可以改变Visual Studio和SDK的安装路径;我想在可能的情况下编写“正常工作”的代码。

所以我花了一点时间研究VS2017如何生成一个新项目,我最终找到了一个答案,即当VS2017升级现有的C项目时,它会忘记升级一个关键项目值,并且该值不正确 - Windows SDK版本 - 无法找到标题:

Project Property Pages

默认情况下,VS2017仅为Windows 10 UWP SDK安装标头,但在升级到实际安装的SDK版本的任何项目中都不会更改“Windows SDK版本”!升级后我的设置为“8.1”,并且没有为Windows 8.1安装标头

因此,如果您要升级现有项目,则必须手动将此设置更改为您实际拥有的任何版本的标头:在我的情况下,通过将10.0.14393.0显式添加到列表中(这是VS2017附带的Windows 10 UWP SDK标头的版本号。

(安装版本列表可以在C:\Program Files (x86)\Windows Kits\10\Include文件夹中找到,也可以在附近的类似文件夹中找到。)

答案 2 :(得分:4)

我知道我有点迟到了,但是在Visual Studio 2017中你可以

而不是搞乱路径设置
  • 右键单击项目
  • 选择重新定位项目
  • 选择最新版本或任何新版本的Windows SDK,然后单击“确定”

这将自动处理所有包含路径和库。

答案 3 :(得分:0)

#include "stdafx.h"

<...>"..."之间存在一个众所周知的区别:简而言之,前者适用于库包含,后者适用于本地包含。

您提到您正在寻找stdafx.h,但在编译器安装中找不到它。这表明:

  1. 您认为stdafx.h是一个库文件(它不是,除非它是某些特定于MS的扩展,我怀疑,尽管它传统上用作默认文件名对于预编译的标题,如果你已经创建了一个,那么你几乎肯定没有。

  2. 由于1.,您尚未创建本地文件stdafx.h,因此包含指令应该失败。如果没有,那么就会发生一些可疑的事情。

  3. 关于你的实际问题,我有一些注意事项:

    1. <stdio.h>是C头,而不是C ++头。如果您包含C ++文件(扩展名.cpp,可能是MSVC),那么您应该使用C ++标头<cstdio>。但是,这实际上不应该导致问题。

    2. 您还没有使用stdio(至少不是直接使用)。你正在使用你正确包含的iostream。如果包含的是导致错误的那个,那么iostream试图包含它,不能,并且你的编译器安装已经被安排了。

    3. 尝试类似的程序:

    4. #include <iostream>
      int main() {
          std::cout << "hi" << std::endl;
          return 0;
      }
      

      我刚刚检查过自己在Visual Studio 2015 Professional下正确编译和执行。

      如果此程序编译,我建议重新安装Visual Studio。根据我的经验,这通常可以解决这些棘手的设置问题。

答案 4 :(得分:0)

我遇到了同样的问题,当我运行 vcvarsall.bat 时它得到了解决,它出现在 C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC

答案 5 :(得分:0)

上面提供了每个项目的解决方案。 但是,如果您不想从头开始重新安装VS或在每个解决方案上设置包含目录和库,您可以修改 Toolset.props

C:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ V140 \ Platforms \ Win32 \ PlatformToolsets \ v140 \ Toolset.props

  <PropertyGroup>
....................
    <IncludePath Condition="'$(IncludePath)' == ''">$(VC_IncludePath);$(WindowsSDK_IncludePath);**C:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0\ucrt**</IncludePath>
.......................
    <LibraryPath Condition="'$(LibraryPath)' == ''">$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86;**C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10150.0\ucrt\**</LibraryPath>
...........................
  </PropertyGroup>

答案 6 :(得分:0)

从VS2015升级后,VS2017出现此错误。我尝试了干净+重新安装,它没有修复错误。我发现的问题是双重的:

  1. $(VC_IncludePath); $(WindowsSDK_IncludePath);不在默认包含路径中。
  2. $(VC_IncludePath); $(WindowsSDK_IncludePath);实际上是在默认属性中排除了(这是怎么发生的?!)
  3. 修复新项目: 手动编辑以下文件: %LOCALAPPDATA%\微软\的MSBuild \ V4.0 \ Microsoft.Cpp.Win32.user.props %LOCALAPPDATA%\微软\的MSBuild \ V4.0 \ Microsoft.Cpp.x64.user.props

    确保$(VC_IncludePath); $(WindowsSDK_IncludePath);在IncludePath中,而不在ExcludePath中。

    要修复旧项目(不要从上述文件继承): 在解决方案资源管理器中手动编辑项目属性,并确保$(VC_IncludePath); $(WindowsSDK_IncludePath);在IncludePath中,而不在ExcludePath中。

答案 7 :(得分:0)

在安装当前的Windows SDK之后,我在Visual Studio Community 2015中遇到了同样的问题,并且正如Signa之前已经写过的那样,这可以针对&#34; Toolset.props&#34;中的所有项目进行修复。文件(至少对于VS2015),我发现这是最方便的解决方案,因为这只需要完成一次。我有一些附注,因为有一些值得注意的地方。

对于每个构建平台,都有一个自己的&#34; Toolset.props &#34;文件,因此如果要构建32位和64位目标,则需要进行修改:

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Platforms\Win32\PlatformToolsets\v140\Toolset.props

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Platforms\x64\PlatformToolsets\v140\Toolset.props

这些文件是写保护的,您需要先删除写保护,然后才能更改这些文件(记得在完成后再重新打开)。

截至目前,当前的SDK版本为&#34; 10.0.15063.0 &#34;并且您需要将其调整为您要使用的版本(或您已安装的SDK版本)。

在这些道具文件中查找IncludePath和LibraryPath行,并为其添加以下路径:

  

IncludePath: $(ProgramFiles)\ Windows Kits \ 10 \ Include \ 10.0.15063.0 \ ucrt

     

LibraryPath: $(ProgramFiles)\ Windows Kits \ 10 \ Lib \ 10.0.15063.0 \ ucrt \ $(PlatformTarget)

以下是32位版本的示例:

// ... some XML before that ...
<PropertyGroup>
    // ... executable path .....
    <IncludePath Condition="'$(IncludePath)' == ''">$(VC_IncludePath);$(WindowsSDK_IncludePath);$(ProgramFiles)\Windows Kits\10\Include\10.0.15063.0\ucrt;</IncludePath>
    // ... reference path ...
    <LibraryPath Condition="'$(LibraryPath)' == ''">$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86;$(ProgramFiles)\Windows Kits\10\Lib\10.0.15063.0\ucrt\$(PlatformTarget);</LibraryPath>
    // ... more XML ...
</PropertyGroup>
// ... even more XML ....

答案 8 :(得分:0)

在VS2017再次遇到类似问题之后,我仔细研究了导致这一切的原因。主要原因是我仍在使用修改后的user.props文件。这是一段时间的解决方案,为所有项目添加全局包含和库路径。但Microsoft不推荐使用此功能,应重置这些文件的内容。

我正在谈论的文件是C:\ Users \ your_name \ AppData \ Local \ Microsoft \ MSBuild \ v4.0中的user.props文件 对于测试,您只需重命名(或删除,如果您喜欢风险)它们并重新启动VS.它将为那些创建空文件。如果您使用的是Windows 10,那么在大多数情况下,这已足以解决您的所有问题。即使在较旧的VS版本中(我使用VS2010-VS2017进行了测试,对于更老的VS版本,问题往往涉及注册表项,并且不涉及此道具文件)。 Windows / VS现在已经非常擅长查找所有系统库(包括DirectX,这是我们过去修改这些文件的主要原因)并以正确的包含顺序添加它们。

同样是警告,因为我已经看到其他人的建议。 更改SDK安装的任何.prop。如果您真的需要使用props,那么创建并添加您自己的属性表(可以覆盖任何默认值)到您的项目。不用担心,这些不会被检入源控制,因此您仍然可以将项目分发给其他人。

如果你仍然使用较旧的Windows,它可能不像在Windows 10中那么容易,但我会尝试提供一些提示:

您遇到的具体错误是新的$ UniversalCRT_IncludePath。无需对该路径进行硬编码,该宏应包含正确的路径。所以添加$(UniversalCRT_IncludePath);到您自己的属性中的IncludePath,然后将其添加到项目中。

对于LibraryPath,为每个平台文件添加正确的路径,如$(UniversalCRT_LibraryPath_x64);对于.x64。和$(UniversalCRT_LibraryPath_x86); for .Win32。

尝试解决此问题时可能还有用:您可以找到VisualStudio中构建系统中使用的所有$(MACRO)变量的值。它们非常隐蔽:进入属性 - 自定义构建步骤 - 单击命令行 - 然后不要键入任何内容,只需单击向下按钮即可进行编辑...&#34; - 你点击它 - 你得到一个对话框,其中有一个&#34;宏&gt;&gt;&#34;按钮。 包含一个包含所有宏值的列表。

答案 9 :(得分:-1)

安装Visual Studio 2015 Update 3解决了此问题,包括新项目和更新前创建的现有项目。

https://www.visualstudio.com/news/releasenotes/vs2015-update3-vs