使用 Derelict SDL 时出现分段错误
Segmentation fault when using Derelict 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()
下面的所有内容都被注释掉,问题仍然会出现。
此外,derelict 在尝试加载 SDL 时抛出异常,但我认为这很常见:
derelict.util.exception.SymbolLoadException@../../.dub/packages/derelict-util-2.0.4/source/derelict/util/exception.d(35): Failed to load symbol SDL_QueueAudio from shared library libSDL2.so
我是 运行 初级 OS 并且使用 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 版本。 Derelict 应该适用于任何 2.X 版本的 SDL。您不必在任何大牌 Linux 发行版上构建 SDL。这样做来修复它:
// Change this
DerelictSDL2.load();
// To this
DerelictSDL2.load(SharedLibVersion(2, 0, 2));
我正在尝试使用 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()
下面的所有内容都被注释掉,问题仍然会出现。
此外,derelict 在尝试加载 SDL 时抛出异常,但我认为这很常见:
derelict.util.exception.SymbolLoadException@../../.dub/packages/derelict-util-2.0.4/source/derelict/util/exception.d(35): Failed to load symbol SDL_QueueAudio from shared library libSDL2.so
我是 运行 初级 OS 并且使用 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 版本。 Derelict 应该适用于任何 2.X 版本的 SDL。您不必在任何大牌 Linux 发行版上构建 SDL。这样做来修复它:
// Change this
DerelictSDL2.load();
// To this
DerelictSDL2.load(SharedLibVersion(2, 0, 2));