获取“无法打开包括文件:'atlbase.h':没有那个文件或目录”错误。

23

我正在两台Windows 8.1笔记本电脑之间切换,刚从TFS加载了我的项目。在一台机器上可以编译,在另一台机器上却无法编译,并显示第一个错误。

error C1083: Cannot open include file: 'atlbase.h': No such file or directory

在这两台笔记本电脑上,我都运行着Visual Studio Ultimate 2013。在第一台笔记本电脑上,我已经检查了它从哪里获取atlbase.h,它是从C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include中获取的,即从Visual Studio 2012安装目录中获取的。在新机器上,我没有安装Visual Studio 2012,因此目录C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include不存在。

其他人也有类似的问题(例如Ramilol's question),因为他们正在使用Visual Studio Express。我正在使用Ultimate。

这可能是一个环境变量问题(如suggested by raj raj),但我的包含目录路径在VC++ Directories下是$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath),正如所需的那样。

我的一般问题是“我该如何解决这个问题?”,但我也想知道如何检查和设置$(VCInstallDir)的值,因为C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\include确实包含了atlbase.h(所以我不知道为什么它没有被捡起来)。
========== 编辑1:重新措辞 ==========
让我再试着重新措辞这个问题。
我从TFS将一个Visual Studio 2013项目加载到新的构建笔记本电脑上。它无法构建,并显示错误,如error C1083: Cannot open include file: 'atlbase.h': No such file or directory。在新机器上,文件atlbase.h位于目录C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\include中。
在我的项目属性中,我的包含目录路径位于VC++ Directories下,分别为$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath)
我该如何检查这些宏的设置,如果它们不在atlbase.h所在的位置(即C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\include),我该如何解决? ========== 编辑2:已安装Microsoft Visual C ++ Redistributables ========== 回应jp2code的回答,工作正常的计算机和不工作的计算机都安装了类似的Microsoft Visual C ++ Redistributables数组,如下图所示(左侧为工作正常的计算机):

MSVC++RedistScreenshot

========== 编辑3:环境变量 ==========

在他的回答中,pje解释了如何查找环境变量。%VCInstallDir%被正确设置为C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\,但是如果我右键点击#include <atlbase.h>这一行,我会得到以下错误提示,这表明尽管%VCInstallDir%正确,但VS并不是在那里寻找:

open file error screenshot

========== 编辑 4:平台工具集设置 ==========

另一个可能性是项目设置中的配置属性 | 常规 | 平台工具集,由评论中的manuell和Michael Burr在他的回答中建议。对于该项目,它被设置为Visual Studio 2012 (v110),但下拉列表中列出的唯一其他选项是v110_wp80,当选择它时,它变成了Windows Phone 8.0 (v110)。如果我在记事本中手动编辑.vcxproj文件并重新打开Visual Studio Ultimate 2013中的项目,则属性页现在将平台工具集列为Visual Studio 2013 (v120)(未安装)

如果我启动新的C ++ Windows Store项目,我可以轻松设置平台工具集为Visual Studio 2013 (v120),实际上它是下拉列表中唯一列出的选项。(注:新项目将目标平台版本设置为“Windows 8.1”,并且它已灰显,因此我无法更改,而失败的项目将其设置为Windows 8。)

========== 编辑 5: 整个项目设置文件 ==========

在评论中,Michael 建议“也许将 .vcxproj 文件发布到某个地方(比如在 github 上作为一个 gist)可能会有帮助”。我已经在 这里 发布了它。

========== 编辑 6: 卸载并重新安装 Visual Studio 2013 Ultimate ==========

没有效果,相同的错误仍然出现。


2
这些机器上的VS2013安装非常混乱。通常是由于之前安装了早期版本(如预览版或试用版),并没有正确卸载导致的。因此,安装程序会随机跳过步骤,因为注册表中已经存在子包的记忆。非常难以修复。 - Hans Passant
1
这是一个全新的构建 - 没有旧版本。 - dumbledad
非常有趣的@manuell,它被设置为“Visual Studio 2012(v110)”。然而下拉菜单只包含两个选项,“Visual Studio 2012(v110)”和“v110_wp80”,当首次选择时,后者变成“Windows Phone 8.0(v110)”。 - dumbledad
你应该尝试创建一个新的解决方案,看看这些奇怪的选项是否也在其中。 - manuell
手动地,Michael提出了类似的建议。在记事本中编辑.vcxproj文件并在Visual Studio Ultimate 2013中重新打开项目后,属性页面现在将平台工具集列为“Visual Studio 2013(v120)(未安装)”! - dumbledad
显示剩余12条评论
5个回答

11
在新机器上,我没有安装Visual Studio 2012。那就是问题所在。您的项目针对VS2012工具集来构建Windows 8.0运行的Store项目。您仍然可以在VS2013中打开它,但只有在安装了VS2012的情况下才能构建。换句话说,您必须在计算机上安装v110工具集。您没有安装。除了安装VS2012之外,您还必须将其重新定位到8.1才能使用VS2013工具集(v120)构建。右键单击“解决方案资源管理器”窗口中的“解决方案”节点,然后选择“将Windows Store项目重新定位到Windows 8.1”。不要担心笔记本电脑太多关于VS2012的内容,听起来它曾经安装过,但卸载不彻底。

难道不应该期望从2012年升级到2013年吗? - flup
是的,我描述了它。"重新定位 Windows Store" 菜单项。他们在 VS2013 中支持 8.0 的努力非常少,这是可以理解的,因为升级到 8.1 是免费的。 - Hans Passant
哦,我明白了。我习惯于在新的VS版本中打开我的项目时,启动完整的向导来修复它们并生成报告。(另一方面,我也习惯于重新创建VS项目以使它们正确) - flup
汉斯 - 这很有趣。不幸的是,将其转向8.1会导致其他问题(或者说使其他问题浮现),这些问题会妨碍项目的构建:错误 X5608:编译的着色器代码使用了太多算术指令槽(122),但我可以开始解决这个问题。 - dumbledad

6

请检查"配置属性 | 常规 | 平台工具集"项目设置是否正确:

Visual Studio 2013 (v12)

而不是像"Visual Studio 2012 (v110)"这样的东西。


它不是,它被设置为“Visual Studio 2012(v110)”,但下拉列表中列出的唯一其他选项是“v110_wp80”,当选择该选项时,它变成了“Windows Phone 8.0(v110)”。鉴于 Visual Studio 2013 是计算机上唯一安装的 Visual Studio 版本,我需要做什么才能获得你提到的“Visual Studio 2013(v12)”平台工具集设置?另外,奇怪的是,VS2013 页面上只提到了 Visual Studio 2012 作为一个选项:http://msdn.microsoft.com/en-us/library/8x480de8.aspx - dumbledad
这个项目是32位还是64位的?在这个VS2013安装中是否安装了64位工具?新创建的C++项目是否提供VS213(v120)平台工具集? - Michael Burr
1
另外,值得一试的是:关闭VS,备份后用记事本打开.vcxproj文件,并将所有实例的<PlatformToolset>v110</PlatformToolset>更改为<PlatformToolset>v120</PlatformToolset>,然后查看VS2013的反应。 - Michael Burr
如果这不那么令人沮丧,那就有点好笑了。在记事本中编辑了 .vcxproj 文件并在 Visual Studio Ultimate 2013 中重新打开项目后,属性页现在将平台工具集列为“Visual Studio 2013 (v120)(未安装)”。有任何想法为什么 VS2013 认为 VS2013 没有安装? - dumbledad
1
@dumbledad:不知道。我认为需要重新安装(也许在卸载后)。 - Michael Burr
我卸载了Visual Studio Ultimate 2013,然后重新安装。但是出现了相同的错误和症状。 - dumbledad

6
如果你想查看$(VCInstallDir)或其他Visual Studio宏的值,那么打开VS2013开发人员命令提示符(这应该已经随 VS 2013 安装而安装)。在提示符中键入:echo %VCInstallDir%。这将打印$(VCInstallDir)宏的当前值。如果您想将其更改为其他目录,请键入set VCInstallDir=<directory path>,其中<directory path>是您所需目录的路径(在您的情况下可能是C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\include)。希望这能有所帮助,谢谢!------编辑-------
另外一点,可能是这些宏与您尝试加载并使用2013编译的2012项目一起导入的。如果最终发现是$(VCInstallDir)宏错误,那就可以解释原因了。

我已经检查了%VCInstallDir%(感谢您解释如何执行此操作),并且在两台计算机上,它都是C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC,这让我感到非常困惑,因为它没有看到文件 :-( - dumbledad
稍等,它们是不同的。出现故障的机器缺少尾随的 \,让我看看是否有帮助...没有。 - dumbledad

5

可能的解决方案

  1. 获取Process Monitor
  2. 过滤atlbase.h

这样你就会知道Visual Studio正在寻找atlbase.h的确切位置。进程监视器将显示打开文件失败的尝试。

此时,您可以通过以下方式解决问题:

  1. 创建符号链接(混乱)
  2. 修复包含目录路径(更好)

更新 以下是如何过滤文件操作:

filter settings

别忘了在设置筛选器参数后单击添加


听起来很有用的工具,乔治。你如何按文件名过滤?我得到的过滤器可能性列表包括架构、认证ID、类别、...、用户、版本和虚拟化。详细信息和描述听起来可能,但没有产生任何结果。我如何过滤 altbase.h - dumbledad

2

请检查两台机器是否安装了相同版本的C++分发程序。

这是一个值得一试的方法,而且非常容易检查。

截图


它们并不完全相同,但非常接近。我将在问题中添加一张截图。 - dumbledad
3
Visual C++ Redistributables 不包含 ATL 头文件。 - Sheng Jiang 蒋晟

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接