SDL Video Init在Mac OS X 10.8上导致异常 我刚把我的C++游戏移植到OSX,第一次运行时,当试图调用 SDLYStVIEWMODMOD时,我得到以下异常。

SDL Video Init在Mac OS X 10.8上导致异常 我刚把我的C++游戏移植到OSX,第一次运行时,当试图调用 SDLYStVIEWMODMOD时,我得到以下异常。,c++,macos,sdl,osx-mountain-lion,C++,Macos,Sdl,Osx Mountain Lion,2012-09-28 15:01:05.437 SCRAsteroids[28595:707]*由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因是:“在第259行创建CGSWindow时出错(1000)” *第一次抛出调用堆栈: ( 0 CoreFoundation 0x00007fff8b53b716例外预处理+198 1 libobjc.A.dylib 0x00007fff90e30470 objc_异常_抛出+43 2 CoreFou

2012-09-28 15:01:05.437 SCRAsteroids[28595:707]*由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因是:“在第259行创建CGSWindow时出错(1000)” *第一次抛出调用堆栈: ( 0 CoreFoundation 0x00007fff8b53b716例外预处理+198 1 libobjc.A.dylib 0x00007fff90e30470 objc_异常_抛出+43 2 CoreFoundation 0x00007fff8b53b4ec+[N异常提升:格式:][204 3应用套件0x00007fff8a26a579 n带有不透明形状2+655的创建窗口 4应用套件0x00007fff8a268d70-[NSWindow\u commonAwake]+2002 5 AppKit 0x00007fff8a2277e2-[NSWindow\u commonInitFrame:styleMask:backing:defer:+1763 6 AppKit 0x00007fff8a22692f-[NSWindow\u initContent:styleMask:backing:defer:contentView:+1568 7 AppKit 0x00007fff8a2262ff-[NSWindow initWithContentRect:styleMask: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 10 libSDL-1.2.0.dylib 0x0000000107c17af5 SDL_SetVideoMode+917 11类固醇0x0000000107be60fb_ZN11SDLGraphics4initEP6IWorldii+291 ) libc++abi.dylib:terminate调用引发异常 中止陷阱: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);
if(SDL_Init(SDL_Init_EVERYTHING)<0)
返回false;
const SDL_VideoInfo*VideoInfo=SDL_GetVideoInfo();
如果(!videoInfo){
fprintf(标准,“视频查询失败:%s\n”,
SDL_GetError());
返回false;
}
/*要传递到SDL_SetVideoMode的标志*/
videoFlags=SDL_OPENGL;/*在SDL中启用OpenGL*/
videoFlags |=SDL_GL_DOUBLEBUFFER;/*启用双缓冲*/
videoFlags |=SDL|U调色板;/*将调色板存储在硬件中*/
/*这将检查曲面是否可以存储在内存中*/
如果(视频信息->硬件可用)
videoFlags |=SDL|U表面;
其他的
videoFlags |=SDL|U表面;
如果(w==0){
widthViewport=videoInfo->current\u w;
高度视口=视频信息->当前高度;

Cux

SDLYMIN又是罪魁祸首。我的C++ <代码>主< /COD>例程在一个不包含代码> SDL.H./C>的文件中,所以它没有重新定义为<代码> SDLIOME < /COD>。代码包含了<代码> SDL< /C>,而不是在一个可重用的静态库中,没有主例程,我手动将我的函数名改为<代码> s。DL_main

这意味着SDL提供了基本的主例程。我不喜欢这样做,但就目前而言,对于Mac而言,SDL 1.2.15是必要的


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

相同的问题,但是通过链接LbSDLMIN(以及LIbSDL)来解决。这又需要两个框架:基础和COCOA。< /P>


我没有重命名主函数。

在cocoa中调用视频卡时出现问题。因此,您需要在调用SDL\u 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();
}
#包含//使其在mac上工作
//在使用SDL之前必须调用它,否则它在osx上无法工作。
void pre_init()
{
void*cocoa_lib;
cocoa_lib=dlopen(“/System/Library/Frameworks/cocoa.framework/cocoa”,RTLD_-LAZY);
无效(*nsappload)(无效);
nsappload=(void(*)()dlsym(cocoa_lib,“NSApplicationLoad”);
nsappload();
}

`

您的主文件是否包含SDL.h?如果是,您的main()将被重命名!