使用MinGW G++编译包含<windows.h>的C++代码时出现异常编译器错误
编译错误解决方案
核心问题根源
你当前的错误本质是手动将微软官方Windows SDK的头文件路径加入了MinGW GCC的头搜索目录,MinGW本身已经自带适配GCC语法的Win32 API头文件,两种来源的头文件定义完全不兼容,产生冲突。
优先解决方案(99%场景适用)
- 直接从你的头文件包含目录中移除以下两个微软Windows SDK路径:
C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/um C:/Program Files (x86)/Windows Kits/10/Include/10.0.20348.0/shared - 同步移除路径中的32位MinGW头文件目录
C:/msys64/mingw32/include/c++/10.2.0/i686-w64-mingw32/bits,你使用的是64位MinGW GCC,混入32位头路径会引发额外架构冲突。
修改完成后直接执行原有编译命令g++ -fpermissive -std=c++2a nuevotest.cpp即可正常编译。
错误原因说明
- 所有
expected primary-expression before ';' token类错误:微软SDK中NULL的定义依赖MSVC编译器的特有宏定义,GCC环境下缺少对应宏,导致NULL无法被识别为合法表达式。 redefinition of 'struct timeval'错误:微软SDK的winsock头文件中timeval的定义,和GCC自带标准库time.h中的定义重复,MinGW自带的winsock头文件已经做了去重适配,不会出现该冲突。
特殊场景处理(需要使用高版本Windows新API)
如果确实需要调用高版本Windows SDK才提供的新API,不要直接加SDK头路径,而是在编译参数中添加-D_WIN32_WINNT=0x0A00(数值根据你需要的最低Windows版本调整,0x0A00对应Windows 10及以上),MinGW自带的头文件会自动启用对应版本的API声明。
内容的提问来源于stack exchange,提问作者drak09
相关产品推荐
相关产品推荐

