使用Xcode 4在Mac OS X Lion上设置SDL

时间:2011-11-22 02:14:08

标签: macos xcode4 osx-lion sdl

我一直在努力让一个超级简单的SDL程序工作。我正在使用Mac OS X Lion。我有SDL在Snow Leopard工作,但它似乎不想在狮子身上工作。到目前为止,我有这个:

#include <iostream>
#include "SDL/SDL.h"

using namespace std;

/*
#ifdef main
#  undef main
#endif
*/

int main( int argc, char* args[] )
{
    SDL_Surface* hello = NULL;
    SDL_Surface* screen = NULL;
    SDL_Init( SDL_INIT_EVERYTHING );
    screen = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
    hello = SDL_LoadBMP( "hello.bmp" );
    SDL_BlitSurface( hello, NULL, screen, NULL );
    SDL_Flip( screen );
    SDL_Delay( 2000 );
    SDL_FreeSurface( hello );
    SDL_Quit();

    return 0;
}

当我尝试编译此代码时(在Xcode 4.1中),它给了我这个错误:

Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
     (maybe you meant: _SDL_main)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果我取消注释当前评论的#ifdef内容,程序将编译,但随后会在SDL_SetVideoMode行上接收SIGABRT。我刚才在另一个程序中看到了这些注释的东西,我不确定我是否应该拥有它。

我该怎么做这个?

4 个答案:

答案 0 :(得分:4)

SDL标头文件使用宏重新定义main。这是在SDL_main.h中:

#define main    SDL_main

但这很好。 SDL提供自己的main()函数,然后调用您的版本。因此,摆脱这些定义,它们会使情况变得更糟,而不是更好。

如果您的项目是基于Cocoa的,那么您可能错过了在项目中包含SDLmain.m。这提供了Cocoa友好main()函数。如果您的项目是本机C ++,那么我的猜测是您没有在项目中包含所有SDL库,因此链接器没有看到SDL自己的main()

答案 1 :(得分:2)

如果您使用的是SDL框架,则只需将文件SDLMain.h和SDLMain.m添加到项目中(假设您已经将SDL.framework添加到项目中)。

您可以在SDL diskimage的“devel-lite”文件夹中找到这些文件,您可以在此处下载:http://www.libsdl.org/release/SDL-1.2.15.dmg

这两个文件将为您提供一个Cocoa友好的主例程,以便您的SDL应用程序可以是一个表现良好的OS X应用程序。

答案 2 :(得分:1)

SDL.h不包含SDL_main.h 文件中的第一行应为:

#include SDL_main.h

SDL_main重新定义主函数,然后进行自己的初始化,这是使SDL与OS X一起工作所必需的

编译时,除了libSDL

之外,还需要链接libSDLmain

答案 3 :(得分:0)

对于纯C ++和我来说,我有与OP相同的链接时间错误。 OpenGL应用程序,解决方案是使用https://github.com/Ricket/HelloSDL

中的示例项目

这使我添加了Cocoa库,但would have been needed anyway因为我的目标是iPhone。