"ошибка 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
Что позволило компиляции завершить без ошибок.