vs2015无法打开afxwin.h,afxext.h,afxdisp.h,afxdtctl.h,afxcmn.h,afxcontrolbars.h,SDKDDKVer.h等文件

前言

前两天,配置OpenCV环境,完成之后,打开早期项目,出现一系列的问题,最直接的就是标题所示的报错,费了九牛二虎之力解决了,留下解决过程,以帮助类似陷在坑里的朋友及早出来。本着授之以鱼,不如授之以渔,详细说明了问题的查找过程,也可移步到解决部分,查看结果。

起因

最近调试电脑使用的OpenCV类库是4.5.1版本,是官方下载解压的标准版,用于测试相机控制接口和训练样本库。突然接到新任务需要升级老项目涉及3.4.2类库,在原来的环境基础上配置之后,问题就来了,出现标题所示的报错。记忆中好像在配置包含文件目录或者库目录时在下面的对话框点击过“从父级或者项目默认设置继承”的选项,但是后来又改回去了,不过只是表面改回去了,报错出现后才发现的。

分析

正如标题所示,发现所有这些文件实际上与MFC基础类库相关,在stdafx.h文件中,无论是x86还是x64环境,所有依赖的类库文件(afxwin.h,afxext.h,afxdisp.h,afxdtctl.h,afxcmn.h,afxcontrolbars.h,SDKDDKVer.h等文件)全部不能打开。搜索问题发现stackoverflow有人建议重装修复,诚然最直接的办法就是重装vs,于是在控制面板选择更改,然后在弹出的vs窗口选择修复,重装结束再次打开,遗憾的是依然没有解决。

反复对比项目属性表,发现在系统属性表的VC++包含目录看不到本来应该有的“$(VC_IncludePath);$(WindowsSDK_IncludePath);”同样在库目录也看不到本来应该显示的“$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86”。于是对照早期的项目文件将这两种路径相应的填写到两种目录中,在测试项目再次编译,发现MFC文件可以识别了,然后配置OpenCV属性表,再次编译发现除了报目标环境x64与使用环境x86不符外没有其他报错了,继续修改x64的VC++目录,包含目录一样,但是库目录改为“$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64”,再次编译正常,可以运行。

创建一个新的MFC项目,默认的x86环境下正常无报错,而改到x64环境就会出现同样错误。查看x64环境下的项目属性表,VC++的包含目录和库目录均为空白

由此,可以确定问题出在vs包含目录和库目录的文件保存方面,而且通过“修复”功能无法解决,这应该是vs2015的一个bug,误操作也不该出现这个问题。

解决

查找MFC基础类库与VS包含目录、库目录的关系。

通过这篇文章《VS中包含目录、附加包含目录、库目录、附加库目录及附加依赖项的继承关系》,了解到系统属性表和项目属性表的区别,即系统属性表(属性管理器中名称为Microsoft.Cpp.x64.user这类的)配置过后,对所有项目都会产生继承,而项目属性表(其他或者自定义添加的属性表)则只针对当前项目。

这位大老《为Visual Studio添加默认INCLUDE包含路径一劳永逸的方法(更新)》的文章真正解开了我的问题。

提到修改 C:\Users\<user>\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props 这个文件,在这个文件里添加需要include的目录,但是在vs2012就不好使了。

于是提出了修改 "VS安装目录中的\VC\VCWizards\default.vcxproj" 这个文件,定位到文件末尾,在</Project>之前插入如下内容

<PropertyGroup>
  <IncludePath>$(VCInstallDir)\WTL\include;$(IncludePath)</IncludePath>
</PropertyGroup>

这篇文档主要讲解添加WTL、Boost、DX等环境的问题,但是对我的启发就是确认了出错的文件。于是通过与正常电脑环境对比发现,C:\Users\<user>\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.x64.user.props文件中有不一样的地方,这是出错的文件:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets">
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup>
    <IncludePath />
    <LibraryPath />
  </PropertyGroup>
  <ItemDefinitionGroup />
  <ItemGroup />
</Project>

这是正常的文件:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets">
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup>
    <ReferencePath>$(ReferencePath)</ReferencePath>
  </PropertyGroup>
  <ItemDefinitionGroup />
  <ItemGroup />
</Project>

可以看到出错文件中的属性组的包含目录和库目录不能形成一个完整的节点

<IncludePath />
<LibraryPath />

改为

<ReferencePath>$(ReferencePath)</ReferencePath> 

再次测试,完全好了,创建新项目切换环境都没有问题了。 

附录

(同样类似问题大家的解决办法)

1.MFC VS2013 配置 opencv 出现无法打开afxcmn.h,afxdisp.h,afxext.h,SDKDDKVer.h,afxcontrolbars.h等等文件

2.cannot open source file “afxwin.h”/“afxext.h”/“afxdisp.h”/“afxdtctl.h”/“afxcmn.h”/afxdisp.h etc

3.VS重装后修改VC++包含目录、继承值以及附加依赖项等 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值