MSYS2 GCC链接MinGW编译的Raylib库时出现_assert未定义引用,缺失哪个依赖库?
我之前在MSYS环境里折腾Raylib的时候遇到过一模一样的问题,折腾了好一会儿才搞明白根源——MSYS的GCC和你下载的MinGW编译版Raylib,针对的是完全不同的运行环境。
问题原因拆解
MSYS的GCC是为x86_64-pc-msys这个类POSIX的环境编译的,它依赖的是MSYS2自己的C标准库;而你下载的Raylib 3.7.0是用原生MinGW-w64编译的,针对的是Windows原生环境,依赖的是msvcrt或者MinGW的标准库。两者的底层系统调用、标准库实现都有差异,所以就会出现_assert这类标准库函数的未定义引用,GLFW相关的错误也是同样的道理——GLFW库也是MinGW环境编译的,和MSYS的GCC不兼容。
具体解决方案
这里给你三个可行的解决方向,按靠谱程度排序:
1. 切换到MinGW-w64的GCC工具链(最推荐)
如果你的MSYS2环境里已经装了mingw64的工具链,直接打开Mingw64 Terminal(而不是MSYS Terminal),然后用里面的gcc执行你原来的编译命令就行——MinGW的GCC能完美识别同环境编译的Raylib库,不会有兼容性问题。
如果没装mingw64工具链,在MSYS终端里用pacman安装:
pacman -S mingw-w64-x86_64-gcc
之后用mingw64-gcc代替gcc来编译:
mingw64-gcc main.c -Iraylib-3.7.0_win64_mingw-w64/include -Lraylib-3.7.0_win64_mingw-w64/lib -lraylib -lopengl32 -lgdi32 -lwinmm
2. 在MSYS环境下重新编译Raylib库
如果一定要用MSYS的GCC,那最好自己在MSYS环境里编译一份Raylib源代码:
# 克隆Raylib仓库(如果没装git先执行 pacman -S git) git clone https://github.com/raysan5/raylib.git cd raylib/src # 用MSYS的GCC编译 make PLATFORM=PLATFORM_DESKTOP CC=gcc
编译完成后,用生成的libraylib.a替换你原来的MinGW版本库,再链接你的代码就能解决问题了。
3. 尝试调整链接选项(临时修复,不保证全解决)
你可以试试在链接命令末尾添加-lmsvcrt,强制链接MinGW的标准库,看看能不能覆盖缺失的符号:
gcc main.c -Iraylib-3.7.0_win64_mingw-w64/include -Lraylib-3.7.0_win64_mingw-w64/lib -lraylib -lopengl32 -lgdi32 -lwinmm -lmsvcrt
不过这个方法可能只能解决_assert这类标准库的问题,GLFW相关的错误大概率还是存在,所以还是优先前两个方案。
内容的提问来源于stack exchange,提问作者efel




