d - 使用废弃 SDL 时的分段错误



我正在尝试使用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):无法从共享库 libSDL2.so 加载符号SDL_QueueAudio

我正在运行 Elementary 操作系统,并使用 apt-get 来确保 SDL 是最新的。

非常感谢您的帮助。

这几乎可以肯定是 SDL 版本控制问题造成的。

我的建议是从源代码构建整个事情。无论如何,这并不难。

您可以在此处获取 SDL2 源代码:

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

确保您也获得额外的项目,即 sdl2 图像、网络、混音器和 ttf。这些链接位于:

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

要安装它们,您通常

./configure
make
sudo make install

会做这个伎俩。首先执行 SDL2,然后按您喜欢的任何顺序执行其余操作。

我在Debian/Fedora/Ubuntu上也遇到了这个问题。它正在查找 SDL 1.2 而不是您的 SDL 2.X,并且无法绑定到该 SDL 2.X。您需要指定要使用的 SDL 版本。废弃应该可以与任何 2.X 版本的 SDL 一起使用。您不必在任何大牌 Linux 发行版上构建 SDL。执行此操作以修复它:

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

最新更新