将 Visual C++ 项目迁移到 Visual Studio 2013 - DirectShow 基类错误 C2169
Posted
技术标签:
【中文标题】将 Visual C++ 项目迁移到 Visual Studio 2013 - DirectShow 基类错误 C2169【英文标题】:Migrating Visual C++ project to Visual Studio 2013 - DirectShow baseclasses error C2169 【发布时间】:2016-01-11 11:39:01 【问题描述】:我已将 Visual C++ 项目迁移到 Visual Studio 2013。当我尝试构建项目时,编译器返回以下错误:
Error 2 error C2169: '_InterlockedIncrement' : intrinsic function, cannot be defined
错误在 combase.h(来自 DirectShow 的标头),代码是:
static inline LONG WINAPI InterlockedIncrement(volatile LONG * plong)
return InterlockedIncrement( const_cast<LONG*>( plong ) );
InterlockedIncrement 在 winnt.h 中定义为:
#define InterlockedIncrement _InterlockedIncrement
你知道这个错误的任何解决方案吗?
【问题讨论】:
***.com/a/18548135/17034 @HansPassant 我将 DirectShow 库放入 ` ..\sdk\ ` 文件夹。我有另一个项目用实际的库成功编译,所以我认为我错过了项目的一些设置。另外,我已经尝试过Enable Intrinsic Functions
(是和否),但我仍然有同样的错误。
对于 GraphStudioNext,我们将baseclasses 作为解决方案的一部分。还有一个VS2013项目。
【参考方案1】:
您的#define
将所有出现的InterlockedIncrement
替换为_InterlockedIncrement
,因此static inline LONG WINAPI InterlockedIncrement(volatile LONG * plong)
变为static inline LONG WINAPI _InterlockedIncrement(volatile LONG * plong)
。
这意味着您实际上是在尝试定义 _InterlockedIncrement
函数,这是被禁止的,因为它是一个内在函数。
我认为你需要删除
#define InterlockedIncrement _InterlockedIncrement
如果需要,使用适当的参数转换使InterlockedIncrement
调用_InterlockedIncrement
。
【讨论】:
#define
它实际上在 winnt.h 中,它是 Windows SDK 的头文件,所以我没有定义 InterlockedIncrement
或先使用#undef InterlockedIncrement
,然后使用static inline LONG WINAPI InterlockedIncrement(volatile LONG * plong) return _InterlockedIncrement( const_cast<LONG*>( plong ) );
以上是关于将 Visual C++ 项目迁移到 Visual Studio 2013 - DirectShow 基类错误 C2169的主要内容,如果未能解决你的问题,请参考以下文章
Visual C++:将传统 C 和 C++ 字符串代码迁移到 Unicode 世界
从 Visual Studio C++ 6.0 到 VS 2008?
从旧的 Borland C++ 迁移到 Visual C++ Express
将 C++ Win32 控制台项目类集成到 Visual Studio 2008 中的 Visual C++(Windows 窗体应用程序)项目中