使用废弃SDL时出现分段错误

时间:2016-03-03 17:24:28

标签: sdl d derelict3

我正在尝试使用Derelict和D来编写一个简单的图形测试程序。

当我尝试用SDL做几乎任何事情时,它会出现故障。以下是有问题的代码:

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 @ .. / .. / .dub / packages / derelict-util-2.0.4 / source / derelict / util / exception.d(35):无法从共享加载符号SDL_QueueAudio library libSDL2.so

我正在运行Elementary OS并使用apt-get来确保SDL是最新的。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

这几乎可以归结为SDL版本问题。

我的建议是从源头构建整个事物。 无论如何都不难。

您可以在此处获取SDL2来源:

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

确保您也获得额外的项目,即sdl2 image,net,mixer和ttf。 这些链接位于:

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

安装它们,通常

./configure
make
sudo make install

会做到这一点。首先执行SDL2,然后按照您喜欢的顺序执行其余操作。

答案 1 :(得分: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));