Windows下开发OpenGL程序运行提示不支持16位应用问题咨询
问题根因
你犯了非常典型的GCC参数误用错误:编译命令里带的-c参数是告诉GCC只执行编译步骤、跳过链接环节,这个参数输出的是.o格式的中间目标文件,根本不是Windows可识别的PE格式可执行程序。你强行把这个中间二进制文件命名成.exe后缀,系统加载时读不到合法的32/64位程序头,就会误判为不支持的16位应用弹框报错。
除了核心的-c参数问题,你脚本里还有几个会导致后续编译/运行失败的问题,需要一并修正:
- 链接库配置错误:既没链接你要用的freeglut、GLEW的库文件,还多写了完全无关的
-lbz2(这是bzip2压缩库,和OpenGL开发没有关系);另外GCC链接对顺序有要求,依赖库必须放在被依赖对象的后面,乱序会报未定义引用错误。 - 架构匹配问题:先确认你下载的GLEW、freeglut库版本和本地安装的MinGW GCC架构一致——打开命令提示符输入
gcc -v,看输出里的Target字段,x86_64开头就是64位编译器,必须配64位版本的依赖库;i686开头是32位编译器,要配32位依赖,混装的话编译完也无法启动。 - 运行时依赖问题:编译通过后,要把对应架构的
freeglut.dll、glew32.dll(注意64位版本的GLEW dll也叫这个名称,不要和32位版本混淆)放到生成的exe同目录,或者把dll所在路径加到系统PATH里,否则会弹缺失dll的报错。
修正后的批处理脚本
把你原来的bat内容替换成下面的内容,记得把路径里的myusername改成你自己的Windows用户名:
@echo off gcc %1.c -o %1.exe ^ -I"C:\Users\myusername\Desktop\Graphics\Dependencies\FreeGlut\include" ^ -I"C:\Users\myusername\Desktop\Graphics\Dependencies\Glew\include" ^ -L"C:\Users\myusername\Desktop\Graphics\Dependencies\FreeGlut\lib" ^ -L"C:\Users\myusername\Desktop\Graphics\Dependencies\Glew\lib" ^ -lfreeglut -lglew32 -lopengl32 ^ -Wl,--subsystem,windows -Wall
如果你打算用静态库版本的依赖,免去携带dll运行的步骤,需要额外加两个宏定义、替换链接的库名:把命令第一行的gcc参数改成
gcc -DFREEGLUT_STATIC -DGLEW_STATIC %1.c -o %1.exe,后面的链接参数把-lfreeglut -lglew32换成-lfreeglut_static -lglew32s即可。
操作步骤
- 先把之前生成的错误的HelloGLUT.exe删掉,避免旧文件干扰
- 按照前面说的方法检查GCC架构和依赖库架构是否匹配,不匹配就重新下载对应版本的依赖包替换
- 运行修正后的批处理脚本,传入代码路径参数重新编译,正常情况下不会有链接报错
- 把对应版本的两个dll复制到exe所在目录,双击运行就能看到GLUT的示例窗口了。
内容的提问来源于stack exchange,提问作者Math Rules
相关产品推荐
相关产品推荐

