"ошибка C2733: вторая связь C перегруженной функции"

Я пытаюсь собрать xercesc 3.1 на 64-битной Windows 7, используя Visual Studio 2005. Я скачал исходный код с официального сайта и следовал приведенным там инструкциям (в основном просто "откройте.sln и соберите проект XercesLib"), но я получаю следующие ошибки компиляции:

error C2733: second C linkage of overloaded function '_interlockedbittestandset' not allowed
error C2733: second C linkage of overloaded function '_interlockedbittestandreset' not allowed

Я заметил, что версия SDK в этом сообщении об ошибке была 6.1, тогда как 7.0 была выпущена с Windows 7. Поэтому я попытался добавить C:\Program Files\Microsoft SDKs\Windows\v7.0\include в каталоги дополнительных включений проекта, но это не имело никакого эффекта.

Я также проверил, что открыл правильный файл sln - я выбрал файл с надписью "VC8", который, по моему мнению, должен соответствовать VS2005.

1 ответ

Решение

После еще нескольких поисков с другими терминами, я обнаружил, что это известная ошибка в VS2005 при включении как winnt.h, так и intrin.h.

Самый простой способ для этого - использовать препроцессор для переименования проблемных функций при включении одного из заголовков.

Однако в случае Xercesc используются функции, поэтому требуется немного больше работы. Я использовал решение, подробно описанное в этом блоге:

#if _MSC_VER >= 1400
//  Following 8 lines: workaround for a bug in some older SDKs
#   pragma push_macro("_interlockedbittestandset")
#   pragma push_macro("_interlockedbittestandreset")
#   pragma push_macro("_interlockedbittestandset64")
#   pragma push_macro("_interlockedbittestandreset64")
#   define _interlockedbittestandset _local_interlockedbittestandset
#   define _interlockedbittestandreset _local_interlockedbittestandreset
#   define _interlockedbittestandset64 _local_interlockedbittestandset64
#   define _interlockedbittestandreset64 _local_interlockedbittestandreset64
#   include <intrin.h> // to force the header not to be included elsewhere
#   pragma pop_macro("_interlockedbittestandreset64")
#   pragma pop_macro("_interlockedbittestandset64")
#   pragma pop_macro("_interlockedbittestandreset")
#   pragma pop_macro("_interlockedbittestandset")
#endif

Что позволило компиляции завершить без ошибок.

Другие вопросы по тегам