2013-07-01 24 views
5

Wczoraj postanowiłem pobrać, zainstalować i próbować korzystać z Allegro 5. Pobrałem także Code :: Blocks 12.11 w/MinGW kompilator. Założyłem wszystko i poprawnie zainstalowane wszystko (lub tak myślałem) i próbował uruchomić przykładowy kod, aby sprawdzić, czy to działa:Punkt wejścia procedury _gxx_personality_v0 nie mógł być zlokalizowany w bibliotece DLL. LibstdC++ - 6.dll Błąd

#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; 
} 

Gdy próbuję skompilować i uruchomić program pojawia się komunikat box błąd mówiąc "Punkt wejścia procedury _gxx_personality_v0 nie mógł być zlokalizowany w bibliotece DLL, libstdC++ - 6.dll". Przeszukałem internet przez około godzinę, próbując znaleźć rozwiązanie tego problemu, tak jak robię to w większości przypadków, ale wyszedłem z pustymi rękami. Zastanawiam się, czy ktoś ma jakieś pomysły na jakiekolwiek poprawki tego problemu, jeśli tak, daj mi znać JAK NAJSZYBCIEJ! Z góry dziękuję!

+0

Co daje "gcc -v"? Czy pasuje do wersji Allegro, którą pobrałeś ? – Matthew

Odpowiedz

8

__gxx_personality_v0 służy do obsługi wyjątków biblioteki C++. MinGW może obsługiwać kilka różnych modeli wyjątków na x86: sjlj (setjmp/longjmp) lub DWARF (DW2). O ile mi wiadomo, który model będzie używany, jest kompilowany w kompilatorze - nie jest to coś, co można wybrać za pomocą opcji wiersza poleceń.

Model wyjątku sjlj zostanie połączony z __gxx_personality_sj0, a łącza modelu wyjątku DW2 zostaną połączone z __gxx_personality_v0. Wygląda na to, że Twój kompilator buduje model wyjątków dw2, ale w czasie wykonywania znajduje on libstdc++-6.dll, który został zbudowany przy użyciu modelu sjlj. Sprawdź, czy masz wiele wersji libstdc++-6.dll w systemie youR i sprawdź, czy skopiowanie innego do tego samego katalogu, co program, rozwiązuje problem.

Możesz użyć nm libstdc++-6.dll | grep personality, aby zobaczyć, który wyjątek "osobowość" używa biblioteka DLL.

+0

Dziękuję za odpowiedź! Przeszukałem cały mój komputer i nie mogłem znaleźć żadnego innego .dll o tej nazwie oprócz tego, który znajduje się w folderze bin MinGW. Próbowałem dodać go do folderu projektu i kompilować i uruchomić, ale nadal zwracał ten sam błąd: ( – TobyFromMarketing

+0

co robi 'nm libstdC++ - 6.dll | grep personality' mówi o tym? –

+0

Ah - czy ten program zależy od bibliotek DLL, które zostały wcześniej skompilowane (tj. nie skompilowane w twoim systemie)? Jeśli tak, być może twój kompilator to 'sjlj' i jedna lub więcej z tych bibliotek DLL było w wersji oczekiwanej' dw2'. kompilacja bibliotek alternatywnych w celu dopasowania do obsługi wyjątku dla kompilatora (lub może zmienić kompilatory MinGW na taki, który używa obsługi wyjątków dw2). –

1

Wpadłem też na to. Czy niektóre wyszukiwania, ktoś wspomniał zwracając uwagę na to, czy jesteś w trybie debugowania lub wydania. Odnosi się to szczególnie do Code :: Blocks. Znalazłem tryb debugowania. Zmieniłem to na tryb wydania i mój program został skompilowany i uruchomiony.

Jestem tym zaniepokojony ... Wydaje mi się, że powinien działać w obu trybach, więc jak mam to naprawić, aby tak się stało? Nie mam odpowiedzi. Może ktoś wypowie się z rozwiązaniem. W międzyczasie skompiluj i uruchom w trybie Release Mode zamiast Debug Mode.

Po prostu zrobiłem trochę szaloną naukę, usunąłem libstdC++ 6.dll z MinGW/bin i umieściłem w innym folderze. Następnie skopiowałem ten sam plik z Gimp/bin. Nie ma już błędu linkera, zamiast tego pojawia się błąd, który mówi, że aplikacja się nie uruchomiła :(nadal kompiluje i działa w trybie wydawania

Powiązane problemy