将 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&lt;LONG*&gt;( 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 窗体应用程序)项目中

从 Visual Studio 2008 迁移到 2015

解读将 Visual C++ 6 项目升级到 Visual Studio 2008 时出现的错误