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

Я пытаюсь создать xercesc 3.1 на 64-битной Windows 7 с помощью Visual Studio 2005. Я загрузил источник с официального сайта и следил за инструкциями, приведенными там (в основном, просто "откройте проект.sln и build project 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 в дополнительные каталоги проекта 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
</intrin.h>

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

licensed under cc by-sa 3.0 with attribution.