3

总结:编译Release版本的时候报Undeclared identifier SetDefaultDllDirectoriesfrom atlcore.h,但是编译Debug的时候就OK了。进一步的调查表明,_USING_V110_SDK71_扮演的角色。它应该继承自项目默认值(见下图),但不适用于组合:Release MinDependency 和 v140_xp。

详细信息:我正在将 C++ 本机 ATL 应用程序从 Visual C++ 2005 迁移到 Visual C++ 2015。目标是尽可能长时间地保持 Windows XP 运行版本。因此,为项目设置了 v140_xp 平台工具集。它适用于调试版本。但是,它会导致 Release MinDepency 版本的编译错误。使用 v140(不带 _xp)时,它编译得很好。

这是需要迁移的应用程序的一个分支。我已经成功将其他分支(更早的)迁移到了VC++ 2008、2010、2012和2013。(或者我忘了做某事,或者现在情况不同了。)

我已经看到其他地方也提到过这个错误;但是,原因可能不同。完整的错误行是:

1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcore.h(644):
error C2065: 'SetDefaultDllDirectories':undeclared identifier

有问题的行用于以下情况

#ifndef _USING_V110_SDK71_

因此,显然没有定义该符号。我正在使用 Visual Studio 2015 Professional,版本 14.0.23107.0 D14REL 和 Windows 8.1。

检查项目设置时,_USING_V110_SDK71_应定义符号——从项目默认值继承。

_USING_V110_SDK71_应该被定义!?

更新:输出窗口中的错误消息和周围的行:

1>------ Build started: Project: Market, Configuration: Release MinDependency Win32 ------
1>  SplashScreen.cpp
1>c:\program files (x86)\microsoft sdks\windows\v7.1a\include\sal_supp.h(57): warning C4005: '__useHeader': macro redefinition
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\sal.h(2886): note: see previous definition of '__useHeader'
1>c:\program files (x86)\microsoft sdks\windows\v7.1a\include\specstrings_supp.h(77): warning C4005: '__on_failure': macro redefinition
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\sal.h(2896): note: see previous definition of '__on_failure'
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcore.h(644): error C2039: 'SetDefaultDllDirectories': is not a member of '`global namespace''
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcore.h(644): error C2065: 'SetDefaultDllDirectories': undeclared identifier
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\include\atlcore.h(646): error C2065: 'LOAD_LIBRARY_SEARCH_SYSTEM32': undeclared identifier
1>c:\program files (x86)\microsoft visual studio 14.0\vc\wtl90\include\atlgdi.h(470): warning C4838: conversion from 'int' to 'UINT' requires a narrowing conversion
1>c:\program files (x86)\microsoft visual studio 14.0\vc\wtl90\include\atlgdi.h(477): warning C4838: conversion from 'int' to 'UINT' requires a narrowing conversion
1>c:\program files (x86)\microsoft visual studio 14.0\vc\wtl90\include\atlgdi.h(484): warning C4838: conversion from 'int' to 'UINT' requires a narrowing conversion
1>c:\program files (x86)\microsoft visual studio 14.0\vc\wtl90\include\atlgdi.h(491): warning C4838: conversion from 'int' to 'UINT' requires a narrowing conversion
1>c:\program files (x86)\microsoft visual studio 14.0\vc\wtl90\include\atlgdi.h(3683): warning C4838: conversion from 'LONG' to 'DWORD' requires a narrowing conversion
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

你能解释一下吗?谢谢

4

1 回答 1

3

如果您从 Visual Studio 的早期版本转换项目文件,则可能会将某些构建设置(包括预处理器宏定义)发送到每个单独文件的配置设置中。要检查这一点,请右键单击源文件并点击属性,然后导航到预处理器选项卡。如果您在 Preprocessor Definitions 字段中看到粗体文本,那么您就会知道这是您的罪魁祸首。要修复它,您需要让每个文件都从项目设置中继承,这可能很乏味;我发现在文本编辑器中加载 vcxproj 并删除有问题的定义是最容易的。

于 2015-11-03T04:19:02.983 回答