2011-11-22 12 views
7

He intentado hacer funcionar un programa SDL super sencillo. Estoy usando Mac OS X Lion. Tengo SDL para trabajar en Snow Leopard, pero parece que no quiere trabajar en el león. Hasta ahora tengo esto:Configuración de SDL en Mac OS X Lion con XCode 4

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

Cuando intento compilar el código (en Xcode 4.1) que me da este 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) 

Si Descomentar la materia #ifdef he comentado en la actualidad, el programa compila, pero luego recibe SIGABRT en la línea SDL_SetVideoMode. Eso que comenté que acabo de ver en otro programa, no estoy seguro si se supone que lo tengo o no.

¿Cómo se supone que voy a hacer que esto funcione?

+0

¿Puede proporcionar el comando emitido por XCode para compilar/vincular el programa? (Deshacerse de las cosas #ifdef, BTW) –

+0

@BrettHale No estoy seguro de cómo encontraría ese comando. Está utilizando los valores predeterminados de la plantilla de la aplicación de línea de comandos con C++ Edit: Creo que lo encontré: http://pastebin.com/zprm01Kp – Cole

Respuesta

4

Los archivos de encabezado SDL redefinen main con una macro. Esto está en SDL_main.h:

#define main SDL_main 

Pero esto está bien. SDL proporciona su propia función main() que luego llama a su versión. Así que deshazte de esas definiciones, lo están empeorando, no mejorando.

Si su proyecto está basado en Cocoa, es probable que haya olvidado incluir SDLmain.m en su proyecto. Esto proporciona una función compatible con Cocoa main(). Si su proyecto es C++ nativo, supongo que no incluyó todas las librerías SDL en su proyecto, por lo que el vinculador no está viendo el propio main() de SDL.

+0

Mi proyecto es C++. Veo esa línea #define en SDL_main.h. ¿Qué quieres decir con que no nucleé todas las libs de SDL? SDL.h, que he incluido, incluye muchos otros archivos de cabecera SDL, por lo que debería tener lo que necesito. ¿Qué más podría importar? Aunque, no veo ningún archivo .cpp en el marco. – Cole

+0

SDL.h es un archivo de encabezado, no una biblioteca. El código de SDL se almacena en una biblioteca o en un marco (según cómo haya instalado SDL). Debe agregar las bibliotecas o el marco al proyecto para que el vinculador pueda obtener el código SDL. – Miguel

+0

Bueno, creo que hice eso. En mi pestaña "crear fases" de Xcode, tengo SDL.framework en la sección "Enlace binario con bibliotecas". La importación de SDL.h solo está en mi main.cpp. ¿Se supone que debo agregar el marco en otro lugar? – Cole

1

SDL.h no incluye SDL_main.h La primera línea del archivo debe ser:

#include SDL_main.h 

SDL_main redefine la función principal y luego no se requiere la inicialización de su propia para obtener SDL trabaja con el sistema operativo X

al compilar, también tendrá que enlazar en libSDLmain además de libSDL

+0

Eso no me cambia nada, pero realmente no entiendo vincular libSDLmain. Estoy usando un framework (mac os 10.7), y además mi SDL.h incluye SDL_main.h. – Cole

2

Si está utilizando el marco SDL sólo hay que añadir los archivos SDLMain.h y SDLMain.m a su proyecto (suponiendo y o ya ha agregado SDL.framework a su proyecto).

encontrar estos archivos en la carpeta "desa-lite" de la DiskImage SDL, que se puede descargar aquí: http://www.libsdl.org/release/SDL-1.2.15.dmg

Estos dos archivos le dará una rutina principal Cacao de usar, por lo que su aplicación SDL puede ser una aplicación OS X de buen comportamiento.