这是我正在使用的代码。
#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。我真的不确定为什么。我怎样才能让他们回来?
答案 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版本 - 无法找到标题:
默认情况下,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中你可以
而不是搞乱路径设置这将自动处理所有包含路径和库。
答案 3 :(得分:0)
#include "stdafx.h"
<...>
和"..."
之间存在一个众所周知的区别:简而言之,前者适用于库包含,后者适用于本地包含。
您提到您正在寻找stdafx.h
,但在编译器安装中找不到它。这表明:
您认为stdafx.h
是一个库文件(它不是,除非它是某些特定于MS的扩展,我怀疑,尽管它传统上用作默认文件名对于预编译的标题,如果你已经创建了一个,那么你几乎肯定没有。
由于1.,您尚未创建本地文件stdafx.h
,因此包含指令应该失败。如果没有,那么就会发生一些可疑的事情。
关于你的实际问题,我有一些注意事项:
<stdio.h>
是C头,而不是C ++头。如果您包含C ++文件(扩展名.cpp
,可能是MSVC),那么您应该使用C ++标头<cstdio>
。但是,这实际上不应该导致问题。
您还没有使用stdio(至少不是直接使用)。你正在使用你正确包含的iostream。如果包含的是导致错误的那个,那么iostream试图包含它,不能,并且你的编译器安装已经被安排了。
尝试类似的程序:
#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出现此错误。我尝试了干净+重新安装,它没有修复错误。我发现的问题是双重的:
修复新项目: 手动编辑以下文件: %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