7

C++ ゲームを OS X に移植したばかりですが、初めて実行したときに を呼び出そうとすると、次の例外が発生しますSDL_SetVideoMode

2012-09-28 15:01:05.437 SCRAsteroids[28595:707] * キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了します。理由: 'エラー (1000) 259 行目に CGSWindow を作成中' *First throw call stack: ( 0 CoreFoundation 0x00007fff8b53b716 __exceptionPreprocess + 198 1 libobjc.A.dylib 0x00007fff90e30470 objc_exception_throw + 43 2 CoreFoundation 0x00007fff8b53b4ec +[NSException raise:format:] + 204 3 AppKit 0x00007fff8a26a579 _NSCreateWindowWithOpaqueShape2 + 655 4 AppKit 0x00007fff8a268d70 -[NSWindow _commonAwake] + 2002 5 AppKit 0x00007fff8a2277e2 -[NSWindow _commonInitFrame:styleMask:backing:defer:] + 1763 6 AppKit 0x00007fff8a22692f -[NSWindow _initContent:styleMask:backing:defer:contentView:] + 1568 7 AppKit 0x00Rec007fff8a2262 inWithContentNSffitstyleMask:backing:defer:] + 45 8 libSDL-1.2.0.dylib 0x0000000107c228f6 -[SDL_QuartzWindow initWithContentRect:styleMask:backing:defer:] + 294 9 libSDL-1.2.0.dylib 0x0000000107c20505 QZ_SetVideoMode + 2837 1. libSDL-1. .dylib 0x0000000107c17af5 SDL_SetVideoMode + 917 11 SCRAsteroids 0x0000000107be60fb _ZN11SDLGraphics4initEP6IWorldii + 291 ) libc++abi.dylib: 例外をスローして呼び出しを終了する トラップを中止する: 6dylib 0x0000000107c17af5 SDL_SetVideoMode + 917 11 SCRAsteroids 0x0000000107be60fb _ZN11SDLGraphics4initEP6IWorldii + 291 ) libc++abi.dylib: 例外をスローして呼び出しを終了する トラップを中止する: 6dylib 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 を使用するのではなく、コマンド ラインでアプリを昔ながらの方法でビルドします。

4

3 に答える 3

6

SDL_main が再び犯人でした。私の C++mainルーチンは を含まないファイルにあったSDL.hため、 に再定義されていませんでしたSDL_main。インクルードするコードSDLは、代わりに再利用可能な静的ライブラリにあり、メイン ルーチンは表示されません。関数の名前を手動で に変更しましたSDL_main。これは、SDL が重要なメイン ルーチンを提供していることを意味します。私はこれを行うのは好きではありませんが、今のところ、SDL 1.2.15Mac では必要です。

Windows では、同じ新しいコードがリンカーの競合を引き起こします。それは新しい問題です。

于 2012-09-30T21:34:40.727 に答える
2

ココアでビデオカードを呼び出すには問題があります。したがって、SDL_Setvideomode を呼び出す前に初期化する必要があります。

次のメソッドを追加し、メイン メソッドで最初に呼び出します

#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();
}

`

于 2013-07-25T17:50:34.277 に答える
0

Same issue, but solved by linking libSDLmain (as well as libSDL). This in turn requires two frameworks: Foundation and Cocoa.

I didn't rename the main function.

于 2012-10-08T10:20:36.277 に答える