一个32位的mfc项目,之前采用vs2019编译,现在换了电脑(系统是win10),采用vs2022编译时,提示如下错误:
1>------ 已启动生成: 项目: aAnsys, 配置: Debug Win32 ------
1>cl : 命令行 warning D9035: “Gm”选项已否决,并将在将来的版本中移除
1>stdafx.cpp
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\sal_supp.h(57,1): warning C4005: “__useHeader”: 宏重定义
1>C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.37.32822\include\sal.h(2866,1): message : 参见“__useHeader”的前一个定义
1>C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\specstrings_supp.h(77,1): warning C4005: “__on_failure”: 宏重定义
1>C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.37.32822\include\sal.h(2876,1): message : 参见“__on_failure”的前一个定义
1>C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.37.32822\atlmfc\include\atlcore.h(659,2): error C2039: "SetDefaultDllDirectories": 不是 "`global namespace'" 的成员
1>C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.37.32822\atlmfc\include\atlcore.h(659,2): error C2065: “SetDefaultDllDirectories”: 未声明的标识符
1>C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.37.32822\atlmfc\include\atlcore.h(661,45): error C2065: “LOAD_LIBRARY_SEARCH_SYSTEM32”: 未声明的标识符
1>已完成生成项目“aAnsys.vcxproj”的操作 - 失败。
========== 生成: 0 成功,1 失败,0 最新,0 已跳过 ==========
代码没有做任何修改,显然是包含的头文件问题导致的,但一般来说windows的头文件我从来都没有作过特别修改。
为了验证是不是和工程是从以前版本升级到2022版本时出现的问题,就用vs2022创建了一个单文档项目(和我要编译的项目类型一致),所有选项都采用默认。发现默认编译的是64位,是没有问题的,编译成功,然后切换到32位再编译,就出现了一样的错误,这说明提倡大家用64位的程序,但我现有的项目依赖了其它很多的库文件,没法切换到64位,所以还是要找到解决办法才行。
根据网上的一些说法,好像也不靠谱,但是给了点提示。
在项目上点右键,属性 -> VC++目录 -> 包含目录,如下所示:
看两个目录:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A
C:\Program Files (x86)\Windows Kits\10
去电脑上查看这两个目录,发现里面都有很多文件,除了这两个目录之外,也有其它的目录,但里面都是只有几个文件,显然不会构成威胁。那既然提示是 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\ 中的文件有重复的定义,所以干脆就把这个目录从包含的目录中删除掉试试。其中注意到这个目录是继承过来的,所以去属性管理器里看看(如果没有打开,就 视图->其它窗口->属性管理器):属性管理器->随便展开一个工程->Debug|Win32->Microsoft.Cpp.Win32.user,双击这个文件,然后 vc++目录->包含目录:
这个里面,第一行就是目标路径,选中它,点上面的“x”号删除掉,然后确定保存。然后再编译,重复定义消失,编译顺利通过,至此问题解决。