Перенос проекта Visual C++ в Visual Studio 2013 — ошибка базовых классов DirectShow C2169

Я перенес проект 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

Знаете ли вы какое-либо решение для этой ошибки?


person Madalin    schedule 11.01.2016    source источник
comment
stackoverflow.com/a/18548135/17034   -  person Hans Passant    schedule 11.01.2016
comment
@HansPassant У меня есть библиотеки DirectShow в папке ` ..\sdk\ `. У меня есть другой проект, который успешно скомпилирован с реальными библиотеками, поэтому я думаю, что есть некоторые настройки проекта, которые я пропустил. Кроме того, я пробовал с Enable Intrinsic Functions (и да, и нет), и у меня все еще есть те же ошибки.   -  person Madalin    schedule 11.01.2016
comment
Для GraphStudioNext у нас есть базовые классы как часть решения. Для него также есть проект VS2013.   -  person CPlusSharp    schedule 11.01.2016


Ответы (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 с соответствующим преобразованием аргумента, если это необходимо.

person Violet Giraffe    schedule 11.01.2016
comment
#define на самом деле он находится в winnt.h, который является заголовком из Windows SDK, поэтому я не определял InterlockedIncrement - person Madalin; 11.01.2016
comment
или сначала #undef InterlockedIncrement, а затем используйте static inline LONG WINAPI InterlockedIncrement(volatile LONG * plong) { return _InterlockedIncrement( const_cast<LONG*>( plong ) ); } - person wimh; 16.01.2016