编译以前项目更改在x64下面时报错:函数“PVOID GetCurrentFiber(void)”已有主体

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

造成冲突,引发一些函数定义多次包含。

解决方法:

就是把这些定义删除掉。

相关推荐
成工小白10 分钟前
【C++ 】智能指针:内存管理的 “自动导航仪”
开发语言·c++·智能指针
sc写算法13 分钟前
基于nlohmann/json 实现 从C++对象转换成JSON数据格式
开发语言·c++·json
SunkingYang17 分钟前
C++中如何遍历map?
c++·stl·map·遍历·方法
Andrew_Xzw18 分钟前
数据结构与算法(快速基础C++版)
开发语言·数据结构·c++·python·深度学习·算法
库库的里昂19 分钟前
【C++从练气到飞升】03---构造函数和析构函数
开发语言·c++
momo卡19 分钟前
MinGW-w64的安装详细步骤(c_c++的编译器gcc、g++的windows版,win10、win11真实可用)
c语言·c++·windows
凤年徐3 小时前
【数据结构初阶】单链表
c语言·开发语言·数据结构·c++·经验分享·笔记·链表
oioihoii3 小时前
C++11 右值引用:从入门到精通
开发语言·c++
木子.李3477 小时前
排序算法总结(C++)
c++·算法·排序算法
freyazzr8 小时前
C++八股 | Day2 | atom/函数指针/指针函数/struct、Class/静态局部变量、局部变量、全局变量/强制类型转换
c++