2

我正在尝试使用 Visual Studio 2005 在 64 位 Windows 7 上构建 xercesc 3.1。我从官方网站下载了源代码并按照那里给出的说明进行操作(基本上,只需“打开 .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。

4

1 回答 1

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

这允许编译完成无错误。

于 2013-08-15T14:51:40.847 回答