win32下面编译成功,但是x64报错
1>GetWord.c
1>md5.c 这两个文件无法编译
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(24125,1): error C2084: 函数"PVOID GetCurrentFiber(void)"已有主体
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(8092,16): message : 参见"GetCurrentFiber"的前一个定义
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(24136,1): error C2084: 函数"PVOID GetFiberData(void)"已有主体
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(8091,16): message : 参见"GetFiberData"的前一个定义
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(24220,24): error C2084: 函数"_TEB *NtCurrentTeb(void)"已有主体
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(24115,1): message : 参见"NtCurrentTeb"的前一个定义
定位头文件,发现可能是同时定义了_M_AMD64和_M_IX86,导致函数重复定义
cpp
//C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h (24125,1): error C2084: 函数"PVOID GetCurrentFiber(void)"已有主体
#if defined(_M_AMD64) && !defined(_M_ARM64EC) && !defined(__midl)
__forceinline
struct _TEB *NtCurrentTeb ( VOID ){ return (struct _TEB *)__readgsqword(FIELD_OFFSET(NT_TIB, Self));}
__forceinline
PVOID GetCurrentFiber ( VOID ){ return (PVOID)__readgsqword(FIELD_OFFSET(NT_TIB, FiberData));}
__forceinline
PVOID GetFiberData ( VOID ){ return *(PVOID *)GetCurrentFiber();}
#endif // _M_AMD64 && !defined(__midl)
//1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(8092,16): message : 参见"GetCurrentFiber"的前一个定义
#if !defined(MIDL_PASS) && defined(_M_IX86)
...
#if !defined(_MANAGED)
__inline PVOID GetFiberData( void ) { return *(PVOID *) (ULONG_PTR) __readfsdword (0x10);}
__inline PVOID GetCurrentFiber( void ) { return (PVOID) (ULONG_PTR) __readfsdword (0x10);}
#endif // !defined(_MANAGED)
#endif // !defined(MIDL_PASS) && defined(_M_IX86)
//1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(24220,24): error C2084: 函数"_TEB *NtCurrentTeb(void)"已有主体
#if defined(_M_IX86) && !defined(MIDL_PASS)
#define PcTeb 0x18
#if !defined(_M_CEE_PURE)
__inline struct _TEB * NtCurrentTeb( void ) { return (struct _TEB *) (ULONG_PTR) __readfsdword (PcTeb); }
#endif // !defined(_M_CEE_PURE)
#endif // defined(_M_IX86) && !defined(MIDL_PASS)
_M_IX86 : 32bit处理器
_M_AMD64 : 64bit AMD处理器 (VC2008以前)
查询GetWord.c的头文件GetWord.h
cpp
#ifndef __getword__
#define __getword__
#ifdef __cplusplus
extern "C" {
#endif
#include "OSHeaders.h"
char* GetWord( char* toWordPtr, char* fromStrPtr, SInt32 limit );
char* GetQuotedWord( char* toWordPtr, char* fromStrPtr, SInt32 limit );
#ifdef __cplusplus
}
#endif
#endif
OSHeaders.h包含Win32header.h定义
#include "Win32header.h" 其中定义了如下内容
cpp
#ifndef _X86_
#define _X86_ 1
#endif
/* Pro4 compilers should automatically define this to appropriate value */
#ifndef _M_IX86
#define _M_IX86 500
#endif
造成冲突,引发一些函数定义多次包含。
解决方法:
就是把这些定义删除掉。