Eclipse C++用MinGW编译freeglut3.2.2报subscripted value错误
问题根因
报错和freeglut 3.2.2官方源码没有关系,问题出在你用的非MinGW-w64版的老旧MinGW工具链的头文件bug:
- 早已停更的原版32位MinGW自带的
winuser.h里,把Win32 API的RAWHID结构体的bRawData成员定义成了单个BYTE值,但微软官方SDK里这个成员是长度为1的字节数组(C语言老式柔性数组写法,用来存变长的HID输入数据)。 - freeglut的代码完全是按照微软官方的标准定义写的,对
bRawData做下标访问的写法是合规的,只是和你本地工具链的错误定义不匹配,才会抛出"subscripted value is neither array nor pointer nor vector"错误。 - 编译前期弹出的几百个警告都是无害的代码风格类提示,不会导致构建失败,不用单独处理。
修复方案
按推荐优先级排序:
方案1:换用MinGW-w64工具链(一劳永逸,最推荐)
你现在用的非w64版MinGW2013年就停止维护了,除了这次的头文件错误,还有一堆C标准兼容、API定义、编译优化的已知bug,后面编译其他Win32开源库还会踩各种坑。
直接换成目前还在持续维护的MinGW-w64(同时支持32/64位编译),重新跑CMake生成Eclipse项目后构建,不用改freeglut任何代码就能直接编过。
方案2:修正MinGW本地头文件(不想换工具链选这个)
如果要保留现有MinGW环境,直接改工具链里的头文件就行:
- 打开MinGW安装目录下的
include/winuser.h - 搜索
RAWHID结构体定义,找到bRawData成员 - 把原来的
BYTE bRawData;改成BYTE bRawData[1];,和微软官方SDK定义对齐 - 保存后重新构建即可
这个改动只是修正了头文件的定义偏差,不会影响其他项目正常编译。
方案3:局部修改freeglut源码(不想动系统头文件选这个)
如果不想改工具链的系统头文件,可以只在freeglut的报错文件里加兼容代码:
打开src/mswin/fg_spaceball_mswin.c,在所有#include语句的最后加下面这段代码:
// 兼容老版本MinGW的RAWHID定义bug #if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) #undef RAWHID typedef struct tagRAWHID { DWORD dwSizeHid; DWORD dwCount; BYTE bRawData[1]; } RAWHID, *PRAWHID, *LPRAWHID; #endif
保存后重新构建就行,这段判断逻辑只会在检测到老式非w64 MinGW时生效,不会影响其他编译器/工具链的正常编译。
内容的提问来源于stack exchange,提问作者Zortexxx
相关产品推荐
相关产品推荐

