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
(... fisrt의 인수가 상기 제 2 값을 갖는) 이동된다
는 this
변수가 제대로 초기화되지 동일한 결과를 가진 severals 클래스를 테스트했습니다.
문제가 될 수도 있습니다.
전화 규칙 간의 차이점을 생각했지만 잘 모르겠습니다.
힙에 개체를 만들어보십시오. 그게 뭐가 바뀌는 지 확인해 보라.'sf :: VideoMode * vm = new sf :: VideoMode (800,600); ' –
Wine 이외의 다른 곳에서 시도해 봤나? 에뮬레이트 된 환경에서의 디버깅은 충분히 까다 롭습니다. 와인에서 비디오를 디버깅하는 것은 끔찍할 수 있습니다. – ssube
생성자에 코드를 제공 할 수 있습니까? 이 ptr을 부패시킬 가능성이 있습니까? –