2011-11-22 17 views
7

Próbowałem uruchomić super prosty program SDL. Używam Mac OS X Lion. Mam SDL do pracy w Snow Leopard, ale wydaje się, że nie chce pracować na lwie. Do tej pory mam to:Konfigurowanie SDL na Mac OS X Lion z 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; 
} 

Kiedy próbuję skompilować ten kod (w Xcode 4.1) daje mi ten błąd:

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) 

Gdybym odkomentowaniu rzeczy #ifdef ja komentowali obecnie, program kompiluje, ale potem odbiera SIGABRT w linii SDL_SetVideoMode. To komentowało rzeczy, które widziałem w innym programie, nie jestem pewien, czy powinienem je mieć, czy nie.

Jak mam to sprawić?

+0

Czy możesz podać polecenie wydane przez XCode, aby skompilować/połączyć program? (Pozbądź się tej rzeczy #ffdef, BTW) –

+0

@BrettHale Nie jestem pewien, w jaki sposób znajdę to polecenie. Używa wartości domyślnych z szablonu aplikacji wiersza poleceń z C++ Edit: Think I found it: http://pastebin.com/zprm01Kp – Cole

Odpowiedz

4

Pliki nagłówkowe SDL ponownie definiują main z makrem. To jest w SDL_main.h:

#define main SDL_main 

Ale to dobrze. SDL udostępnia własną funkcję main(), która następnie wywołuje twoją wersję. Pozbądźcie się tych definicji, robią to gorzej, nie lepiej.

Jeśli Twój projekt bazuje na kakao, prawdopodobnie pominąłeś w projekcie projekt SDLmain.m. Zapewnia to przyjazną dla kakao funkcję main(). Jeśli twój projekt jest natywnym C++, to domyślam się, że nie uwzględniłeś wszystkich bibliotek SDL w twoim projekcie, więc linker nie widzi własnego SDL-a main().

+0

Mój projekt to C++. Widzę, że #define linii w SDL_main.h. Co masz na myśli, że nie nuclide wszystkich bibliotek SDL? SDL.h, które uwzględniłem, zawiera wiele innych plików nagłówkowych SDL, więc powinienem mieć to, czego potrzebuję. Co jeszcze mogę zaimportować? Chociaż nie widzę żadnych plików .cpp w ramach. – Cole

+0

SDL.h to plik nagłówkowy, a nie biblioteka. Kod z SDL jest przechowywany w bibliotece lub strukturze (w zależności od tego, jak zainstalowałeś SDL). Musisz dodać biblioteki lub strukturę do projektu, aby linker mógł uzyskać kod SDL. – Miguel

+0

Cóż, myślę, że to zrobiłem. Na mojej "fazie budowy" zakładki Xcode mam SDL.framework w sekcji "Link Binary With Libraries". Importująca SDL.h jest tylko w moim main.cpp. Czy mam dodać ramy gdzie indziej? – Cole

1

SDL.h nie obejmuje SDL_main.h Pierwszy wiersz w pliku powinny być:

#include SDL_main.h 

SDL_main redefiniuje główną funkcję, a następnie ma własny Inicjalizacja jest wymagane, aby SDL pracy z OS X

Podczas kompilacji, będzie trzeba także odwołują się w libSDLmain oprócz libSDL

+0

To nic dla mnie nie zmienia, ale tak naprawdę nie rozumiem linkowania libSDLmain. Korzystam z frameworka (mac 10.7), a dodatkowo mój SDL.h zawiera SDL_main.h. – Cole

2

Jeśli używasz ramy SDL wystarczy dodać pliki SDLMain.h i SDLMain.m do projektu (zakładając, y ou już dodałeś SDL.framework do twojego projektu).

znaleźć te pliki w „devel-Lite” folderze DiskImage SDL, który można pobrać tutaj: http://www.libsdl.org/release/SDL-1.2.15.dmg

Te dwa pliki daje kakao przyjazną główną procedurę, tak, że SDL aplikacja może być dobrze zachowującą się aplikacją OS X.

Powiązane problemy