2016-03-03 50 views
3

我正在嘗試使用廢棄和D編寫簡單的圖形測試程序。使用廢棄SDL時的分段錯誤

當我嘗試使用SDL執行幾乎任何操作時,它都會發生seg-fault。這是有問題的代碼:

import std.stdio; 
import derelict.opengl3.gl3; 
import derelict.sdl2.sdl; 
import derelict.sdl2.image; 
import derelict.sdl2.mixer; 
import derelict.sdl2.ttf; 
import derelict.sdl2.net; 

void main() 
{ 
    SDL_Window* mainWindow; 
    SDL_GLContext mainGLContext; 

    try 
    { 
     DerelictGL3.load(); 

     // Load the SDL 2 library. 
     DerelictSDL2.load(); 
. 
     DerelictSDL2Image.load(); 
     DerelictSDL2Mixer.load(); 
     DerelictSDL2ttf.load(); 
     DerelictSDL2Net.load(); 
    } 
    catch(Exception e){} 
    finally{} 

    // Initialise SDL 
    if(SDL_Init(SDL_INIT_EVERYTHING) == -1) { 
     throw new Exception("SDL initialization failed"); 
    } 

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,3); 

    Uint32 flags = SDL_WINDOW_SHOWN|SDL_WINDOW_OPENGL; 
    int width = 1024; 
    int height = 768; 

    mainWindow = SDL_CreateWindow("SDL2 OpenGL Example", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, flags); 
    mainGLContext = SDL_GL_CreateContext(mainWindow); 

    DerelictGL3.reload(); 

    SDL_DestroyWindow(mainWindow); 
    SDL_Quit(); 
} 

即使一切都低於SDL_GL_SetAttribute()被註釋掉仍然會出現此問題。

此外,試圖加載SDL遺棄時拋出一個異常,但我認爲這是相當普遍的。

derelict.util.exception.SymbolLoadException @ ../.. /配音/包/ derelict- UTIL-2.0.4 /源/廢棄/ UTIL/exception.d(35):無法從共享庫中加載符號SDL_QueueAudio libSDL2.so

我運行的基本操作系統,並使用apt-get的保證SDL是最新的。

非常感謝您的幫助。

+0

誒,我不使用玩忽職守,不知道它是如何工作在這裏,但我懷疑的負載例外是東西,你可以忽略。如果無法加載該符號,它可能無法完成加載其他符號 - 包括像SDL_init函數那樣需要的符號。 –

+0

@ AdamD.Ruppe謝謝。我誤解了這個關於廢棄裝載機異常的說法。 (https://derelictorg.github.io/using/fail.html)。當我添加回調時,它可以正常工作。但是,有很多東西無法加載,所以我可能安裝了錯誤的SDL。 –

+0

錯誤的最可能原因是您使用的SDL版本太舊。如果您使用的是Derelict-SDL2 2.0.4,則您還必須使用SDL 2.0.4 – Cubic

回答

1

這幾乎可以肯定是SDL版本問題。

我的建議是從源頭上構建整個事情。無論如何,這並不困難。

你可以SDL2源位置:

https://www.libsdl.org/download-2.0.php

確保您還可以獲得額外的項目也是如此,即SDL2圖像,淨,混頻器和TTF。 鏈接這些都是在:

https://www.libsdl.org/projects/

要安裝它們,你平時

./configure 
make 
sudo make install 

會做的伎倆。首先執行SDL2,然後按照您喜歡的順序執行其他操作。

1

我在Debian/Fedora/Ubuntu上也有這個問題。它正在尋找SDL 1.2而不是SDL 2.X,並且無法與之綁定。您需要指定要使用的SDL版本。對於任何2.X版本的SDL,廢棄應該可以正常工作。您不必在任何大名鼎鼎的Linux發行版上構建SDL。這樣做是爲了解決它:

// Change this 
DerelictSDL2.load(); 
// To this 
DerelictSDL2.load(SharedLibVersion(2, 0, 2)); 
+0

,因爲它的工作原理。 ...如果我必須重新編譯所有SDL庫,它可能會阻止我嘗試使用D。 –