我从源代码崩溃中构建的SDL库!

时间:2010-08-16 01:58:55

标签: c++ c sdl borland-c++

我已经使用bcc 5.5.1从源代码成功构建了SDL,但任何使用它的SDL测试应用程序都会在启动时立即崩溃。我正在寻找有关如何解决此问题的一些帮助和/或指导。

为了填写一些信息,使用了SDL-1.2.14。该项目编译为dll,启用了多线程并动态链接到C运行时。我还用调试信息重建了它。当我使用调试器直到崩溃点时,它似乎来自sdlmain中的redirect_stdout。如果我删除sdlmain.lib并直接在SDL测试项目中使用源文件sdl_win32_main.c,那么它不会再崩溃。相反,它只会在SDL_Init例程中崩溃。

我已经检查了所使用的调用约定,它们似乎都匹配 - 一切都使用cdecl。我还检查并确保编译的sdl.dll和测试应用程序使用相同的动态c运行时而不是静态链接。

Borland部分下的SDL wiki提到使用-b来确保枚举与int的大小相同,但默认情况下编译器会启用该选项,除非明确禁用。我确实用编译器/链接器开关重建了SDL,但确实如此。

当它崩溃时,尝试写入某个地址(c000005)时始终存在访问冲突。例如,在典型的SDL init尝试期间,例如:

// initialize SDL video
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
    printf( "Unable to init SDL: %s\n", SDL_GetError() );
    return 1;
}

调用SDL_Init()后,控件不会流回测试应用程序。相反,它崩溃的地方像ntdll.dll中的某个地方一样,与NTDLL.RtlEnterCriticalSection有关。当我在那时检查堆栈跟踪时,我通常会得到这样的结果:

:77982269
:0044A04C
:0043F02B
:0043F7C4
:0043EF25
SDL_CreateSemaphore(1)
SDL_CreateMutex()
SDL_CreateSemaphore(1)
SDL_CreateMutex()
SDL_CreateSemaphore(1)
SDL_CreateMutex()
SDL_CreateSemaphore(1)
SDL_CreateMutex()
SDL_CreateSemaphore(1)
SDL_CreateMutex()
SDL_CreateSemaphore(1)
SDL_CreateMutex()
SDL_CreateSemaphore(1)
//and it keeps recursing... looks like a stackover? :P

我不确定在这一点上尝试,因为我很难过。如果有人有任何建议或需要我提供更多信息,请随时将其添加到评论中。

由于

1 个答案:

答案 0 :(得分:3)

好吧,我终于发现了几天前的问题。崩溃的原因是因为为给定平台编译了错误的源文件。

我使用的项目文件一直在从threads \ generic编译SDL_sysmutex.c。在win32下使用的正确SDL_sysmutex.c应该来自threads \ win32。当我跟踪测试程序并且线程模块有不同的代码行时,我发现了这一点!

通过这个小小的疏忽修复了崩溃的问题几乎消失了,所有的测试演示都按照他们应该的方式运行:)