Visual Studio 2012:C++编译器忽略用户指定的包含目录

11

我遇到了常见的错误:fatal error C1083: Cannot open include file: 'afxres.h': No such file or directory。搜索引擎上有很多相关结果,但是没有提供的解决方案适用于我的情况。

通常情况下,这似乎是路径问题。所以,我确保已安装了相关库,并找到了文件。使用绝对路径作为 #include 可以正常工作:

#include "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxres.h"

但是,如果我将该目录(C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include)添加到项目设置(或 Microsoft.Cpp.Win32.User 属性表)中,并尝试使用以下行:

#include "afxres.h"

我再次收到 C1083 错误。但是,Visual Studio 明显可以找到该文件 - 如果我右键单击文件名并选择“打开文档 'afxres.h'”,则它会立即打开!

为什么 Visual Studio 会忽略我指定的 #include 路径?我以类似的方式包含的其他 #include 路径都可以完美地工作。

Directory is explicitly included in the build settings


1
@JohnDibling:旧的工具>选项>目录方式不再起作用了 - 您可以通过项目设置或属性管理器配置目录(这就是我所做的)。 - Kylotan
1
@notNullGothik:是的,这就是我所说的将其添加到项目设置中的意思。 - Kylotan
1
我已经附上了一张图片,展示了我如何添加路径,因为人们不断提供显而易见的建议。 - Kylotan
1
@MarkRansom:没有头绪。在我使用的最新版本 VC++ 中,它一直存在,并且这是我通常通过 Ms.Win32.Cpp 表格配置系统级库的方式。 - Kylotan
1
是的,尝试了那个,没有运气。 - Kylotan
显示剩余12条评论
2个回答

4
但我之前确实安装了Visual C++ 2010 Express,似乎已经导入了一些设置。这是必要的注释。Express不支持ATL和MFC。仍然缺少的是,你只在先前使用VS2010启动的项目上出现了这个问题。
请注意,在项目属性表中添加路径并不是必要的。可以在屏幕截图中看到,它已经被继承属性中的$(VCInstallDir)atlmfc\include覆盖了。所以,我们可以得出结论,$(VCInstallDir)宏值是错误的。
除了安装错误或破损的注册表之外,当你将先前在VS2010中启动的项目转换时,可能会发生这种情况。从Property Manager切换回Solution Explorer窗口,右键单击你的项目,选择属性,通用页面。将“平台工具集”设置从v100更改为v110。现在,你将使用VS2012包含的目录,而不是VS2010 Express。
请注意,对Microsoft.Cpp.Win32.User项目属性表的更改将影响你的所有项目,你需要将其重置回去。

Hans,我认为你有些言过其实了。其他所有项目都可以正常构建和链接。我在属性表中所做的改变只是添加了两个目录,我需要它们被全局找到。由于它无法找到MFC头文件,所以这似乎是一个有用的放置位置,因为它应该是全局可访问的。 - Kylotan
实际上,我认为你间接地帮助我找到了问题。正如你所说,$(VCInstallDir)atlmfc/include设置应该解决它,但它没有。我刚刚发现$(VCInstallDir)是错误的 - 它指向旧的2010 Express目录,而不是我的新的2012目录。这反过来似乎是因为Visual Studio将所有这些项目的“平台工具集”设置为2010 - 我的2010副本显然没有MFC。 - Kylotan
嗨,汉斯,你能澄清一下“不支持”是什么意思吗?ATL和MFC与其他库有何不同,以至于Express无法处理它们? - ILikeFood
@ILikeFood:我猜想Express只是没有附带ATL和MFC头文件。 - Mooing Duck
我很难过,因为我和帖子原作者遇到了完全相同的问题,只不过这是我们内部标头之一,所以在路径中没有$(VCInstallDir)或类似内容 :< - Mooing Duck
显示剩余3条评论

1

首先,请确保在项目属性 > 配置属性 > 常规 中启用了 MFC。

使用 MFC 必须设置为静态或动态库。

其次,为确保 cl.exe 使用您指定的所有包含目录,您需要转到项目属性 > c/c++ > general 并将 suppress startup banner 更改为 no /nologo-。

这将为每个源文件提供完整的 cl 命令,显示 Visual Studio 尝试使用您提供给它的代码和配置选项的确切内容。

例如:cl /c /ZI /nologo- /W3 /WX- /Od /Oy- /D WIN32 /D _DEBUG /D _CONSOLE /D _UNICODE /D UNICODE /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Yc"StdAfx.h" /Fp"Debug\test.pch" /Fo"Debug\\" /Fd"Debug\vc100.pdb" /Gd /TP /showIncludes /analyze- /errorReport:prompt stdafx.cpp

如果正在使用您的额外包含文件夹,则应在命令行中看到许多额外的-I开关。

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