【发布时间】:2014-06-10 21:33:40
【问题描述】:
我已经使用 bcc 5.5.1 从源代码成功构建了 SDL,但是任何使用它的 SDL 测试应用程序在启动时都会立即崩溃。我正在寻求有关如何解决此问题的帮助和/或指导。
只是为了填写一些信息,使用了 SDL-1.2.14。该项目编译为启用多线程并动态链接到 C 运行时的 dll。我还用调试信息重建了它。当我使用调试器逐步完成崩溃点时,它似乎来自 sdlmain 中的 redirect_stdout。如果我删除 sdlmain.lib 并直接在 SDL 测试项目中使用源文件 sdl_win32_main.c 则不会再崩溃。相反,它只是稍后在 SDL_Init 例程中崩溃。
我已经检查了使用的调用约定,它们似乎都匹配——一切都在使用 cdecl。我还检查并确保编译的 sdl.dll 和测试应用程序使用相同的动态 c 运行时而不是静态链接。
Borland 部分下的 SDL wiki 提到使用 -b 来确保 enum 的大小与 int 相同,但编译器默认启用该选项,除非明确关闭。我确实用那个编译器/链接器开关重建了 SDL 只是为了确定。
当它崩溃时,尝试写入某个地址(c000005)时总是会发生访问冲突。例如,在典型的 SDL 初始化尝试中,如下所示:
// 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
我现在不确定要尝试什么,因为我很困惑。如果有人有任何建议或需要我提供更多信息,请随时将其添加到 cmets。
谢谢
【问题讨论】:
-
您的副本是否使用 gcc 正确构建?
-
我没有尝试过使用 cygwin 或 mingw 之类的 gcc 端口,但我已经使用 vs2008 成功构建了它。我现在正在追踪它,看看差异在哪里。
标签: c++ c sdl borland-c++