编译以前项目更改在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

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

解决方法:

就是把这些定义删除掉。

相关推荐
极客智造14 分钟前
C++ 标准 IO 流全详解:cin /cout/get /getline 原理、用法、区别与避坑
c++·io
charlie11451419121 分钟前
嵌入式C++工程实践第20篇:GPIO 输入模式内部电路 —— 芯片是如何“听“到外部信号的
开发语言·c++·stm32·单片机
样例过了就是过了2 小时前
LeetCode热题100 分割等和子集
数据结构·c++·算法·leetcode·动态规划
麦兜和小可的舅舅3 小时前
ClickHouse 列管理机制解析:从 COW、IColumn 到 CRTP
c++·clickhouse
旖-旎3 小时前
深搜练习(组合)(5)
c++·算法·深度优先·力扣
vegetablesssss3 小时前
vtk镜像图
c++·qt·vtk
@小码农4 小时前
2026年3月Scratch图形化编程等级考试一级真题试卷
开发语言·数据结构·c++·算法
【 】4234 小时前
C++&STL(Standard Template Library,标准模板库)
java·开发语言·c++
一只牛_0074 小时前
pthread亲和性继承的一个坑:main绑核让整个进程退化到单核
c++
张健11564096485 小时前
C++访问控制与友元
java·开发语言·c++