2012-12-21 76 views
0

我嘗試使用帶有mingw32的Gentoo Linux爲Windows創建使用SFML 2.0的prorgam。針對Windows交叉編譯後的創建類的segfault

我不想重新編譯SFML,它的所有的依賴關係,所以我已經下載從the official site(版本32位 - SJLJ)的編譯版本

我編我的代碼,並執行它,酒但是當我嘗試從SFML實例化一個類時它會出現段錯誤。 我嘗試過使用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類一樣。

this變量沒有被正確初始化:

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

this取第一個參數的值,和所有其他值被移位(最前一頁ARG具有第二值,...)

我已經用幾個類測試過相同的結果。

從什麼可能是問題?
我想過調用約定之間的區別,但我不確定。

+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應從這裏得到幫助,但它可以解釋爲什麼從raw分配VideoMode導致段錯誤。

+0

單獨創建'sf :: VideoMode'完全有效;無論如何,這個問題發生在任何階級。使用'sf :: Clock c;'具有相同的效果。 – BAK

+0

那麼,這裏值得一試。 仔細看看你的錯誤後,你的最終猜測顯然是正確的,這個變量在這裏沒有設置或正確處理,因爲它取得了你的第一個參數的值。 您嘗試過的每個班級是否都有完全相同的問題? – tsukasan