Raylib编译报错:undefined reference to `__imp__wassert' 求助
链接错误:undefined reference to __imp__wassert 解决指南
问题描述
下载raylib-4.2.0_win64_mingw-w64.zip后,使用VS Code的C模板并修改tasks.json配置,尝试移除-static-libgcc、调整-std版本等操作,编译项目时仍出现以下链接错误:
C:/raylib-mingw64/lib/libraylib.a(rglfw.o):rglfw.c:(.text+0x2b1e): undefined reference to `__imp__wassert' C:/raylib-mingw64/lib/libraylib.a(rglfw.o):rglfw.c:(.text+0x2ca7): undefined reference to `__imp__wassert' C:/raylib-mingw64/lib/libraylib.a(rglfw.o):rglfw.c:(.text+0x2ceb): undefined reference to `__imp__wassert' C:/raylib-mingw64/lib/libraylib.a(rglfw.o):rglfw.c:(.text+0x2d73): undefined reference to `__imp__wassert' C:/raylib-mingw64/lib/libraylib.a(rglfw.o):rglfw.c:(.text+0x2dad): undefined reference to `__imp__wassert' C:/raylib-mingw64/lib/libraylib.a(rglfw.o):rglfw.c:(.text+0x364f): more undefined references to `__imp__wassert' follow collect2.exe: error: ld returned 1 exit status
备注:不调用Raylib函数时无此错误。当前tasks.json配置如下:
{ "version": "2.0.0", "tasks": [ { "label": "DEBUG-build", "command": "g++", "args": [ "-g", "-std=c++17", "-m64", "-O0", "-Wall", "${workspaceFolder}/src/*.cpp", "-o", "${workspaceFolder}/build/game.exe", "-I./src", "-I./src/include", "-IC:/raylib-mingw64/include", "-static-libgcc", "-LC:/raylib-mingw64/lib", "-lraylib", "-lopengl32", "-lgdi32", "-lwinmm", "-static-libgcc" ], "options": { "cwd": "${workspaceFolder}" }, "type": "shell", "group": "build", "problemMatcher": [], "dependsOrder": "sequence", "dependsOn": [ "debug-dir-check", "DEBUG-quick-clean" ] }, { "label": "RELEASE-build", "command": "g++", "args": [ "-std=c++17", "-m64", "-Ofast", "${workspaceFolder}/src/*.cpp", "${workspaceFolder}/src/my.o", "-o", "${workspaceFolder}/build/game.exe", "-I./src", "-I./src/include", "-IC:/raylib-mingw64/include", "-LC:/raylib-mingw64/lib", "-lraylib", "-lopengl32", "-lgdi32", "-lwinmm", "-static-libgcc" ], "options": { "cwd": "${workspaceFolder}" }, "type": "shell", "group": "build", "problemMatcher": [], "dependsOrder": "sequence", "dependsOn": [ "release-dir-check", "RELEASE-quick-clean", "MY-RC-build" ] }, { "label": "DEBUG-quick-clean", "command": "del ${workspaceFolder}/build/*.exe ; del ${workspaceFolder}/src/*.o", "type": "shell", "group": "build" }, { "label": "DEBUG-clean-dist-copy", "command": "robocopy ${workspaceFolder}/dist ${workspaceFolder}/build *.* /MIR /XF .gitignore ; exit 0", "type": "shell", "group": "build" }, { "label": "RELEASE-quick-clean", "command": "del ${workspaceFolder}/build/*.exe ; del ${workspaceFolder}/src/*.o", "type": "shell", "group": "build" }, { "label": "RELEASE-clean-dist-copy", "command": "robocopy ${workspaceFolder}/dist ${workspaceFolder}/build *.* /MIR /XF .gitignore ; exit 0", "type": "shell", "group": "build" }, { "label": "MY-RC-build", "command": "windres ${workspaceFolder}/src/my.rc ${workspaceFolder}/src/my.o", "type": "shell", "group": "build" }, { "label": "debug-dir-check", "command": "cmd", "args": ["/C", "if not exist ${workspaceFolder}\\build mkdir ${workspaceFolder}\\build"], "group": "build" }, { "label": "release-dir-check", "command": "cmd", "args": ["/C", "if not exist ${workspaceFolder}\\build mkdir ${workspaceFolder}\\build"], "group": "build" }, ] }
问题根源
这个错误是由于raylib的静态库(libraylib.a)编译时依赖动态版本的libgcc,而当前编译参数中混合了静态/动态链接选项,导致链接器无法找到__imp__wassert符号的定义。
解决方案
方案1:改用动态链接libgcc
移除tasks.json中所有-static-libgcc参数,让编译器使用动态版本的libgcc。操作步骤:
- 编辑DEBUG-build和RELEASE-build的
args数组,删除所有-static-libgcc条目 - 确保MinGW安装目录下的
libgcc_s_seh-1.dll、libstdc++-6.dll等动态库能被程序找到(可将这些文件复制到输出目录build下,或添加MinGW的bin目录到系统环境变量)
修改后的DEBUG-build args示例:
"args": [ "-g", "-std=c++17", "-m64", "-O0", "-Wall", "${workspaceFolder}/src/*.cpp", "-o", "${workspaceFolder}/build/game.exe", "-I./src", "-I./src/include", "-IC:/raylib-mingw64/include", "-LC:/raylib-mingw64/lib", "-lraylib", "-lopengl32", "-lgdi32", "-lwinmm" ]
方案2:全静态链接
如果需要生成单文件可执行程序,添加-static参数(会静态链接所有依赖库,包括libgcc、libstdc++和raylib的依赖)。注意:部分系统库可能无法静态链接,需测试兼容性。
修改后的RELEASE-build args示例:
"args": [ "-std=c++17", "-m64", "-Ofast", "${workspaceFolder}/src/*.cpp", "${workspaceFolder}/src/my.o", "-o", "${workspaceFolder}/build/game.exe", "-I./src", "-I./src/include", "-IC:/raylib-mingw64/include", "-LC:/raylib-mingw64/lib", "-lraylib", "-lopengl32", "-lgdi32", "-lwinmm", "-static" ]
额外检查点
- 移除DEBUG-build中重复的
-static-libgcc参数(原配置中写了两次) - 确认链接库顺序:
-lraylib必须放在源文件之后,系统依赖库(-lopengl32等)之前(当前配置顺序正确)
内容的提问来源于stack exchange,提问作者Command17
相关产品推荐
相关产品推荐

