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

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

解决方法:

就是把这些定义删除掉。

相关推荐
chh56336 分钟前
C++--string
java·开发语言·网络·c++·学习
J_yyy1 小时前
基于Reactor的文件管理服务开发笔记
c++·笔记·reactor·多线程编程·muduo
李小小钦2 小时前
D. Storming Arasaka(Codeforces 2238)
c语言·开发语言·数据结构·c++·算法
卷无止境2 小时前
SFML 深度解读:一个教科书级 C++ 多媒体库的内功心法
c++·后端
小徐不徐说3 小时前
Qt 线程迁移机制完整实战指南(moveToThread)
开发语言·c++·qt·程序设计
盐焗鹌鹑蛋4 小时前
【C++】set和map
c++
j7~4 小时前
【算法】专题二:滑动窗口之水果成蓝,找到字符串中所有字⺟异位词等算法题
c++·算法·滑动窗口·水果成蓝·最小字串覆盖·优选算法精选
aqiu1111114 小时前
【算法日记18】LeetCode 15. 三数之和:排序与双指针的降维打击 (附可视化动画源码)
开发语言·c++·算法
一拳一个呆瓜4 小时前
【STL】iostream 编程:文件输出流的成员函数
c++·stl
Huangjin007_4 小时前
【C++11篇(四)】新的类功能、lambda 与包装器详解
开发语言·c++