Setting up SDL on Mac OS X Lion with Xcode 4

2019-01-25 12:32发布

I've been trying to get a super simple SDL program to work. I'm using Mac OS X Lion. I've got SDL to work in Snow Leopard, but it doesn't seem to want to work in lion. So far I have this:

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

When I try to compile this code (in Xcode 4.1) it gives me this error:

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)

If I uncomment the #ifdef stuff I have commented currently, the program compiles, but then receives SIGABRT on the SDL_SetVideoMode line. That commented stuff I have I just saw in another program, I'm not sure if I'm supposed to have it or not.

How am I supposed to get this working?

4条回答
对你真心纯属浪费
2楼-- · 2019-01-25 12:52

If you are using the SDL framework you simply need to add the files SDLMain.h and SDLMain.m to your project (assuming you already have added SDL.framework to your project).

You find these files in the "devel-lite" folder of the SDL diskimage, which you can download here: http://www.libsdl.org/release/SDL-1.2.15.dmg

These two files will give you a Cocoa-friendly main routine, so that your SDL application can be a well-behaving OS X application.

查看更多
Ridiculous、
3楼-- · 2019-01-25 13:00

I had the same link time error as OP for a pure C++ & OpenGL app, and the solutions was to use the sample project from https://github.com/Ricket/HelloSDL

This made me add the Cocoa libraries but that would have been needed anyway since I was targeting the iPhone.

查看更多
小情绪 Triste *
4楼-- · 2019-01-25 13:03

The SDL header files redefine main with a macro. This is in SDL_main.h:

#define main    SDL_main

But this is fine. SDL provides its own main() function that then calls your version. So get rid of those defines, they are making it worse, not better.

If your project is Cocoa based, then you probably missed to include SDLmain.m in your project. This provides a Cocoa friendly main() function. If your project is native C++, then my guess is that you did not include all the SDL libs in your project, so the linker isn't seeing SDL's own main().

查看更多
来,给爷笑一个
5楼-- · 2019-01-25 13:07

SDL.h does not include SDL_main.h The first line in your file should be:

#include SDL_main.h

SDL_main redefines the main function and then does its own initialization the is required to get SDL working with OS X

When compiling, you will also need to link in libSDLmain in addition to libSDL

查看更多
登录 后发表回答