【问题标题】:Visual Studio 2012: C++ compiler ignoring user-specified include directoriesVisual Studio 2012:C++ 编译器忽略用户指定的包含目录
【发布时间】:2013-06-30 04:02:05
【问题描述】:

我遇到了常见错误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 路径也可以完美运行。

【问题讨论】:

  • @hll afxres.h 包含在 MFC 中。
  • @JohnDibling:旧的工具>选项>目录方式不再起作用 - 您可以通过项目设置或属性管理器配置目录(这是我所做的)。
  • @notNullGothik:是的,这就是我说我将它添加到项目设置中的意思。
  • 我附上了一张图片,展示了我是如何添加路径的,因为人们不断提供明显的建议。
  • @MarkRansom:不知道。它一直在我身边(在最新版本的 VC++ 中),这就是我配置系统范围库的方式(通过 Ms.Win32.Cpp 表),通常。

标签: c++ visual-studio-2012 mfc


【解决方案1】:

但我之前确实在这里安装了 Visual C++ 2010 Express,它似乎从中导入了一些设置

这是基本的评论。 Express 不支持 ATL 和 MFC。仍然缺少的是,您仅在以前在 VS2010 上启动的项目中遇到此问题。

请注意,不需要像在项目属性表中那样添加路径。在屏幕截图中可见,它已经被继承属性中的$(VCInstallDir)atlmfc\include 条目覆盖。所以得出的结论是$(VCInstallDir)宏的值是错误的。

除了安装事故或注册表损坏之外,当您转换之前在 VS2010 中启动的项目时,可能会发生这种情况。从属性管理器切换回解决方案资源管理器窗口,右键单击您的项目,属性,常规页面。将“平台工具集”设置从 v100 更改为 v110。您现在将使用 VS2012 包含目录而不是 VS2010 Express 目录。

请注意,对 Microsoft.Cpp.Win32.User 项目属性表的更改将影响您的所有项目,您需要将其重置。

【讨论】:

  • 汉斯,我觉得你有些夸大了。每个其他项目都可以正常构建和链接。我在该属性表中所做的所有更改是添加 2 个需要在全局范围内找到的目录。由于它没有找到 MFC 标头,因此这似乎是一个有用的放置位置,因为它应该是全局可访问的。
  • 我可以确认,取出额外的包含目录(顺便说一句,这是我曾经更改过的所有目录)并不能解决问题。
  • ...也不会用您的版本替换我的文件。这是 VS2012 的全新安装(即 2 天前安装),但我之前确实在这里安装了 Visual C++ 2010 Express,它似乎从中导入了一些设置。
  • 让我们密切关注球。添加 atlmfc/include 目录是完全没有必要的,它已经被添加了。它在您的屏幕截图中可见, $(VCInstallDir)atlmfc/include 设置会处理它。我看不到包含目录的 project 设置。编译器错误强烈表明它是错误的。如果这是 Express 版本,那么您也需要提及。
  • 其实我想你已经间接帮我找到了问题。正如你所说, $(VCInstallDir)atlmfc/include 设置 should 照顾它,但它没有。而且我刚刚发现 $(VCInstallDir) 是错误的 - 它指向旧的 2010 Express 目录,而不是我的新 2012 目录。反过来,这似乎是因为 Visual Studio 将这些项目的所有“平台工具集”设置为 2010 - 而我的 2010 副本显然没有 MFC。
【解决方案2】:

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

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

其次,要确保 cl.exe 使用您指定的所有包含目录,您需要转到项目属性 > c/c++ > 常规并将抑制启动横幅更改为 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 开关。

【讨论】:

    猜你喜欢
    • 2018-05-05
    • 2012-10-13
    • 1970-01-01
    • 2016-11-02
    • 2015-07-31
    • 2016-11-06
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多