2013-08-15 3 views
1

Visual Studio 2005를 사용하여 64 비트 Windows 7에서 xercesc 3.1을 빌드하려고합니다. 공식 사이트에서 소스를 다운로드하고 instructions given there을 따릅니다 (기본적으로 ' 의 .sln 및 구축 프로젝트 XercesLib), 그러나 나는 다음과 같은 컴파일 오류 얻을 : 나는 7.0는 윈도우 7과 함께 출시 된 6.1 반면,이 오류 메시지의 SDK 버전이었다 것으로 나타났습니다'오류 C2733 : 오버로드 된 함수의 두 번째 C 링키지'

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

그래서 나는 시도 C:\Program Files\Microsoft SDKs\Windows\v7.0\include을 프로젝트의 추가 포함 디렉토리에 추가했지만 이는 아무 효과가 없습니다.

나는 또한 올바른 sln 파일을 열었다는 것을 확인했다. VS2005에 해당하는 'VC8'이라는 레이블이 붙어있다.

답변

1

다른 용어로 검색을 한 후 winnt.h와 intrin.h를 모두 포함하면 known bug in VS2005이라는 것을 발견했습니다.

이 중 가장 쉬운 해결 방법은 헤더 중 하나를 포함 할 때 전 처리기를 rename the offending functions으로 사용하는 것입니다.

그러나 Xercesc의 경우 함수가 사용되므로 더 많은 작업이 필요합니다. this blog post에 설명 된 솔루션을 사용했습니다.

#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 

컴파일을 통해 오류없이 완료 할 수있었습니다.

+0

이 솔루션은 'intrin.h'를 혼자 포함 할 수있는 다른 헤더보다 먼저 사용해야합니다. 그 점을 명심하십시오. – 0xC0000022L