调用al_draw_filled_rectangle时触发Segmentation fault问题求助
Allegro程序触发Segmentation Fault的解决办法
我编写了一个在蓝色背景上绘制黑色正方形的简单Allegro测试程序,用于验证环境安装配置是否正确,编译命令如下:
g++ -I "C:\msys64\mingw64\include\" test.cpp -o test.exe -g -lallegro -lallegro_primitives
测试代码:
#include <allegro5/allegro5.h> #include <allegro5/allegro_primitives.h> #include <iostream> int main(int argc, char* argv[]) { al_init(); ALLEGRO_DISPLAY* d = al_create_display(256, 256); if (d == NULL) std::cout << "Error in initializing display" << std::endl; al_clear_to_color(al_map_rgb(0, 0, 255)); al_draw_filled_rectangle(64, 64, 192, 192, al_map_rgb(0, 0, 0)); al_flip_display(); al_rest(30); al_destroy_display(d); al_uninstall_system(); return 0; }
但使用gdb .\test.exe运行程序时,触发Segmentation fault错误,错误信息如下:
Thread 1 received signal SIGSEGV, Segmentation fault. al_lock_mutex (mutex=0x0) at C:/dev/allegro_winpkg/universal/allegro/src/threads.c:325 warning: 325 C:/dev/allegro_winpkg/universal/allegro/src/threads.c: No such file or directory
完整堆栈跟踪:
#0 al_lock_mutex (mutex=0x0) at C:/dev/allegro_winpkg/universal/allegro/src/threads.c:325 #1 0x00007ffc351282bc in get_display_local_data (display=display@entry=0x616fa0) at C:/dev/allegro_winpkg/universal/allegro/addons/primitives/prim_directx.cpp:138 #2 0x00007ffc35129a4b in draw_prim_raw (target=0x617280, texture=0x0, vtx=0x5ffd90, decl=0x0, indices=0x0, num_vtx=4, type=5) at C:/dev/allegro_winpkg/universal/allegro/addons/primitives/prim_directx.cpp:500 #3 0x00007ffc3512a011 in _al_draw_prim_directx (target=target@entry=0x617280, texture=texture@entry=0x0, vtxs=vtxs@entry=0x5ffd90, decl=decl@entry=0x0, start=<optimized out>, start@entry=0, end=<optimized out>, end@entry=4, type=<optimized out>, type@entry=5) at C:/dev/allegro_winpkg/universal/allegro/addons/primitives/prim_directx.cpp:656 #4 0x00007ffc3512e048 in al_draw_prim (vtxs=0x5ffd90, decl=0x0, texture=0x0, start=0, end=4, type=5) at C:/dev/allegro_winpkg/universal/allegro/addons/primitives/primitives.c:104 #5 0x00007ffc35122784 in al_draw_filled_rectangle (x1=<optimized out>, y1=0, x2=<optimized out>, y2=0, color=...) at C:/dev/allegro_winpkg/universal/allegro/addons/primitives/high_primitives.c:422 #6 0x00007ff7a78f1553 in main (argc=1, argv=0xf61b60) at test.cpp:16
我猜测是MinGW配置过程中遗漏了某些步骤,但不知如何修复,恳请各位提供解决方案。
解决办法
从堆栈跟踪可以明确,崩溃的根源是未初始化Allegro的primitives附加库。Allegro的核心初始化al_init()只会初始化基础模块,像primitives这类附加库需要单独调用初始化函数。
具体修复步骤:
- 在
al_init()之后添加al_init_primitives_addon();,完成primitives模块的初始化 - 完善显示创建失败的处理逻辑——如果
d == NULL,直接退出程序,避免后续调用依赖显示的函数引发更多错误
修改后的代码:
#include <allegro5/allegro5.h> #include <allegro5/allegro_primitives.h> #include <iostream> int main(int argc, char* argv[]) { al_init(); // 初始化primitives附加库 al_init_primitives_addon(); ALLEGRO_DISPLAY* d = al_create_display(256, 256); if (d == NULL) { std::cout << "Error in initializing display" << std::endl; // 显示创建失败,直接退出 return 1; } al_clear_to_color(al_map_rgb(0, 0, 255)); al_draw_filled_rectangle(64, 64, 192, 192, al_map_rgb(0, 0, 0)); al_flip_display(); al_rest(30); al_destroy_display(d); al_uninstall_system(); return 0; }
额外注意事项:
- 确保编译时链接的库版本与头文件版本完全匹配,避免混合32位和64位库
- 如果仍然有问题,检查MinGW环境变量是否正确配置,确保编译器能找到Allegro的头文件和库文件
内容的提问来源于stack exchange,提问作者Jake Revell
相关产品推荐
相关产品推荐

