2012-12-21 1 views
0

Windows 용 SFML 2.0을 사용하여 mingw32와 함께 Gentoo Linux를 사용하여 prorgam을 만들려고합니다.Windows 용 교차 컴파일 후 생성 클래스에서 segfault

내가 SFML 모든 그것의 종속성을 다시 컴파일하고 싶지 않아, 그래서 난 the official site (버전 32 비트 - SJLJ)에서 컴파일 된 버전을 다운로드 한 내 코드를 컴파일

, 그리고 와인을 실행, 하지만 내가 SFML에서 수업을 instanciate하려고하면 segfault. SFML의 정적 또는 동적 버전을 사용해 보았지만 아무 것도 변경되지 않았습니다.

디버그 모드를 사용하면 this 값이 SFML 클래스에서 올바르게 초기화되지 않은 것으로 보입니다.

내 컴파일 플래그 :

CXXFLAGS = -W -Wall -ggdb3 -ISFML-2.0-rc/include -DSFML_STATIC 
LDFLAGS = -LSFML-2.0-rc/lib -static-libgcc -static-libstdc++ -mwindows  \ 
      -lsfml-window-s-d -lsfml-graphics-s-d -lsfml-system-s-d -lws2_32 

MAIN.CPP :

#include <SFML/Window.hpp> 

int main() { 
    sf::VideoMode vm(800, 600); 

    return 0; 
} 

와인 오류 :

wine: Unhandled page fault on write access to 0x00000320 at address 0x4021e9 (thread 0026), starting debugger... 
Unhandled exception: page fault on write access to 0x00000320 in 32-bit code (0x004021e9). 
Register dump: 
CS:0023 SS:002b DS:002b ES:002b FS:0063 GS:006b 
EIP:004021e9 ESP:0087fd78 EBP:0087fd78 EFLAGS:00010202( R- -- I - - -) 
EAX:00000320 EBX:7b896ff4 ECX:0087fdd4 EDX:00000258 
ESI:7ffdf000 EDI:004012b0 
Stack dump: 
0x0087fd78: 0087fdf8 004013bd 00000320 00000258 
0x0087fd88: 00000020 0040c387 00401340 004012b0 
0x0087fd98: 0087fdc8 00000000 00000001 7ffdf000 
0x0087fda8: 0087fdc8 7ed71ff4 00409fc0 00418d28 
0x0087fdb8: 00419370 0087fde0 004013ca 0087fd80 
0x0087fdc8: 0087fde8 0040b162 00000001 0000ffff 
Backtrace: 
=>0 0x004021e9 VideoMode+0x9(this=0x320, modeWidth=0x258, modeHeight=0x20, modeBitsPerPixel=0x40c387) [D:\developpement\sfml-misc\release\2.0-rc1\gcc4-sjlj\debug-static\src\SFML\Window/D:/developpement/sfml-master/src/SFML/Window/VideoMode.cpp:50] in chess (0x0087fd78) 
    1 0x004013bd main+0x6c() [/home/bak/projets/bjtu/server architecture/Chess/main.cpp:5] in chess (0x0087fdf8) 
    2 0x004010fd in chess (+0x10fc) (0x0087fe88) 
    3 0x7b85d80f in kernel32 (+0x4d80e) (0x0087fec8) 
    4 0x7bc73ed0 call_thread_func_wrapper+0xb() in ntdll (0x0087fed8) 
    5 0x7bc7690d call_thread_func+0x7c() in ntdll (0x0087ffa8) 
    6 0x7bc73eae RtlRaiseException+0x21() in ntdll (0x0087ffc8) 
    7 0x7bc4c78e call_dll_entry_point+0x61d() in ntdll (0x0087ffe8) 
    8 0xf767106d wine_call_on_stack+0x1c() in libwine.so.1 (0x00000000) 
    9 0xf767112b wine_switch_to_stack+0x2a() in libwine.so.1 (0xffd55c28) 
    10 0x7bc51e6f LdrInitializeThunk+0x2ee() in ntdll (0xffd55c98) 
    11 0x7b86371a __wine_kernel_init+0xa19() in kernel32 (0xffd56e38) 
    12 0x7bc5269b __wine_process_init+0x25a() in ntdll (0xffd56eb8) 
    13 0xf766e5e2 wine_init+0x291() in libwine.so.1 (0xffd56f28) 
    14 0x7bf0106b main+0x7a() in <wine-loader> (0xffd57378) 
    15 0xf74b6596 __libc_start_main+0xe5() in libc.so.6 (0xffd573f8) 
0x004021e9 VideoMode+0x9 [D:\developpement\sfml-misc\release\2.0-rc1\gcc4-sjlj\debug-static\src\SFML\Window/D:/developpement/sfml-master/src/SFML/Window/VideoMode.cpp:50] in chess: movl %edx,0x0(%eax) 

VideoMode.cpp:50은 SFML 클래스와 같이 사용하려고 시도한 것과 같이 생성자의 끝을 참조합니다.

=>0 0x004021e9 VideoMode+0x9(this=0x320, modeWidth=0x258, ... 

this

첫 PARAM의 값을 가지고, 모든 다른 것들은 값

(... fisrt의 인수가 상기 제 2 값을 갖는) 이동된다

this 변수가 제대로 초기화되지 동일한 결과를 가진 severals 클래스를 테스트했습니다.

문제가 될 수도 있습니다.
전화 규칙 간의 차이점을 생각했지만 잘 모르겠습니다.

+0

힙에 개체를 만들어보십시오. 그게 뭐가 바뀌는 지 확인해 보라.'sf :: VideoMode * vm = new sf :: VideoMode (800,600); ' –

+0

Wine 이외의 다른 곳에서 시도해 봤나? 에뮬레이트 된 환경에서의 디버깅은 충분히 까다 롭습니다. 와인에서 비디오를 디버깅하는 것은 끔찍할 수 있습니다. – ssube

+0

생성자에 코드를 제공 할 수 있습니까? 이 ptr을 부패시킬 가능성이 있습니까? –

답변

1

당신이 대신 앞으로 예에서와 같이, 첫 번째 매개 변수로 비디오 모드와 창 개체를 만들려고, 잘못된 방법으로 SFML의 비디오 모드를 초기화하기 나타납니다 :

sf::Window App(sf::VideoMode(800, 600, 32), "SFML Window"); 

을 나는 turorials이해야 추측 여기서 도움이 될 수는 있지만, 왜 원시에서 VideoMode를 할당하면 segfault가 발생하는지 설명 할 수 있습니다.

+0

'sf :: VideoMode'만으로는 완벽하게 유효합니다; 어쨌든, 문제는 모든 클래스에서 발생합니다. 'sf :: Clock c; '를 사용하면 같은 효과가 있습니다. – BAK

+0

음, 여기 시도해 볼 가치가있었습니다. 오류를 면밀히 살펴본 후 최종 추측은 맞습니다.이 매개 변수는 첫 번째 매개 변수의 값을 사용하기 때문에 여기에서 올바르게 설정되거나 처리되지 않습니다. 시도한 모든 수업에 똑같은 문제가 있습니까? – tsukasan

관련 문제