6

昨天我决定下载、安装并尝试使用 Allegro 5。我还下载了带有 MinGW 编译器的 Code::Blocks 12.11。我设置了所有内容并正确安装了所有内容(或者我认为)并尝试运行示例代码以查看它是否可以工作:

#include <stdio.h>
#include <allegro5/allegro.h>

int main(int argc, char **argv){

   ALLEGRO_DISPLAY *display = NULL;

   if(!al_init()) {
      fprintf(stderr, "failed to initialize allegro!\n");
      return -1;
   }

   display = al_create_display(640, 480);
   if(!display) {
      fprintf(stderr, "failed to create display!\n");
      return -1;
   }

   al_clear_to_color(al_map_rgb(0,0,0));

   al_flip_display();

   al_rest(10.0);

   al_destroy_display(display);

   return 0;
}

当我尝试编译和运行程序时,会出现一个错误消息框,提示“无法在动态链接库 libstdc++-6.dll 中找到过程入口点 _gxx_personality_v0。” 我在网上搜索了大约一个小时,试图找到解决这个问题的方法,就像我对大多数事情所做的那样,但我空手而归。我想知道是否有人对解决此问题有任何想法,如果有,请尽快告诉我!提前致谢!

4

2 回答 2

12

__gxx_personality_v0用于 C++ 库的异常处理。MinGW 可以在 x86 上支持几个不同的异常模型:sjlj ( setjmp/ longjmp) 或 DWARF (DW2)。据我所知,将使用哪个模型被编译到编译器中——这不是可以通过命令行选项选择的东西。

sjlj 异常模型会链接到__gxx_personality_sj0,DW2 异常模型会链接到__gxx_personality_v0. 似乎您的编译器正在为 dw2 异常模型构建,但在运行时它会找到一个libstdc++-6.dll使用 sjlj 模型构建的。查看您的系统上是否有多个版本libstdc++-6.dll,并查看将另一个版本复制到与您的程序相同的目录是否可以解决问题。

您可以使用nm libstdc++-6.dll | grep personality来查看 DLL 正在使用哪个异常“个性”。

于 2013-07-02T04:38:07.283 回答
1

我也遇到了这个。做了一些搜索,有人提到要注意您是处于调试模式还是发布模式。这特别适用于 Code::Blocks。我发现我处于调试模式。我将其更改为发布模式,我的程序编译并运行。

不过,我对此感到困扰......在我看来它应该在两种模式下都可以工作,那么我该如何解决它呢?我在那里没有答案。也许有人会对解决方案发表评论。同时,在发布模式而不是调试模式下编译和运行。

我只是做了一点疯狂的科学,从 MinGW/bin 中删除了 libstdc++6.dll 并将其放在另一个文件夹中。然后我从 Gimp/bin 复制了同一个文件。没有更多的链接器错误,而是我收到一个错误,说应用程序无法启动:(尽管仍然编译并在发布模式下运行。

于 2014-02-19T23:50:05.360 回答