2016-03-03 58 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。 –