2012-09-28 54 views
7

我刚将C++游戏移植到OS X并首次运行时,在尝试呼叫SDL_SetVideoMode时出现以下异常。SDL Video Init在Mac OS X上导致异常10.8

2012-09-28 15:01:05.437 SCRAsteroids [28595:707] *终止应用程序由于未捕获的异常 'NSInternalInconsistencyException',原因: *第一掷 '上线259创建CGSWindow错误(1000)'调用堆栈: ( 0的CoreFoundation 0x00007fff8b53b716 __exceptionPreprocess + 198 1 libobjc.A.dylib 0x00007fff90e30470 objc_exception_throw + 43 2的CoreFoundation 0x00007fff8b53b4ec + [NSException提高:格式:] + 204 3了AppKit 0x00007fff8a26a579 _NSCreateWindowWithOpaqueShape2 + 655 4了AppKit 0x00007fff8a268d70 - [ NSWindow _commonAwake] + 2002 5 AppKit的0x00007fff8a2277e2 - [NSWindow _commonInitFrame:styleMask:背衬:延迟:] + 1763 6了AppKit 0x00007fff8a22692f - [NSWindow _initContent:styleMask:背衬:延迟:内容查看:] + 1568 7了AppKit 0x00007fff8a2262ff - [NSWindow initWithContentRect:styleMask:背衬:延迟:] + 45 8 libSDL-1.2.0.dylib 0x0000000107c228f6 - [SDL_QuartzWindow initWithContentRect:styleMask:背衬:延迟:] + 294 9 libSDL-1.2.0.dylib 0x0000000107c20505 QZ_SetVideoMode + 2837 10 libSDL-1.2.0名为.dylib 0x0000000107c17af5 SDL_SetVideoMode + 917个 11 SCRAsteroids 0x0000000107be60fb _ZN11SDLGraphics4initEP6IWorldii + 291 ) 的libC++ abi.dylib:终止称为抛出异常 中止陷阱:6

我的初始化代码如下所示:

if (SDL_Init(SDL_INIT_EVERYTHING) < 0) 
    return false; 

const SDL_VideoInfo *videoInfo = SDL_GetVideoInfo(); 
if (!videoInfo) { 
    fprintf(stderr, "Video query failed: %s\n", 
    SDL_GetError()); 
    return false; 
} 


/* the flags to pass to SDL_SetVideoMode */ 
videoFlags = SDL_OPENGL;  /* Enable OpenGL in SDL */ 
videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */ 
videoFlags |= SDL_HWPALETTE;  /* Store the palette in hardware */ 

/* This checks to see if surfaces can be stored in memory */ 
if (videoInfo->hw_available) 
    videoFlags |= SDL_HWSURFACE; 
else 
    videoFlags |= SDL_SWSURFACE; 

if (w == 0) { 
    widthViewport = videoInfo->current_w; 
    heightViewport = videoInfo->current_h; 
    cout << "Will use full screen resolution of "; 
    videoFlags |= SDL_FULLSCREEN; 
} else { 
    cout << "Will use full user supplied resolution of "; 
    widthViewport = w; 
    heightViewport = h; 
    videoFlags |= SDL_RESIZABLE;  /* Enable window resizing */ 
} 

cout << widthViewport << "x" << heightViewport << "\n"; 
    /* This checks if hardware blits can be done */ 
if (videoInfo->blit_hw) 
    videoFlags |= SDL_HWACCEL; 

/* Sets up OpenGL double buffering */ 
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
/* get a SDL surface */ 
surface = SDL_SetVideoMode(widthViewport, heightViewport, 
    SCREEN_BPP, videoFlags); 

它进入去年SDL调用,并抛出上述异常。我已经在全屏和可调整大小的窗口模式下尝试过它,同样的事情。

我在命令行上构建我的应用程序老派,而不是使用Xcode。

回答

6

SDL_main又是罪魁祸首。我的C++ main例程位于不包含SDL.h的文件中,因此它不被重新定义为SDL_main。包含SDL的代码是在可重用的静态库中,而不是您看到的主程序。我手动将我的功能名称更改为SDL_main,这意味着SDL提供了基本的主程序。我不喜欢这样做,但是现在,在Mac上的SDL 1.2.15,这是必要的。

在Windows上,同样的新代码会导致链接器冲突。这是一个新问题。

0

同样的问题,但通过链接libSDLmain(以及libSDL)解决。这反过来需要两个框架:基础和可可。

我没有重命名主函数。

+1

请问您的主文件包括SDL.h?如果是这样,你的main()将被重命名为你! – ScrollerBlaster

2

在可可中调用videocard有问题。因此,你需要调用SDL_Setvideomode

添加下面的方法之前initalize它,首先把它在你的主要方法

#include <dlfcn.h> //To make it work on mac 

//This must be called before playing with SDL, else it won't work on osx. 

void pre_init() 
{ 
    void* cocoa_lib; 

    cocoa_lib = dlopen("/System/Library/Frameworks/Cocoa.framework/Cocoa", RTLD_LAZY); 
    void (*nsappload)(void); 
    nsappload = (void(*)()) dlsym(cocoa_lib, "NSApplicationLoad"); 
    nsappload(); 
} 

`