Xcode 4 und die SDL..

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Xcode 4 und die SDL..

    Hallo liebe Community!

    Ich habe ein Problem, undzwar möchte ich mit Xcode 4 die SDL unter C++ benutzen. Dazu habe ich zuerst das Framework gedownloaded und in den /Library/Frameworks verschoben. Anschließend dann ein Testprojekt in Xcode erstellt (Konsolenanwendung C++) und als Framework die SDL hinzugefügt. Ebenfalls hab ich einen User Header Search Path hinzugefügt, der nach /Library/Frameworks/SDL.framework/Headers führt, damit ich auch per "SDL.h" die SDL includieren kann und nicht auf <SDL/SDL.h> zurückgreifen muss. Anschließend habe ich die SDLMain.h und die SDLMain.m aus der devel-lite in das Projekt hinzugefügt, da ich gelesen habe, dass es sonst nicht funktioniert.
    Danach hab ich ein Testprogramm geschrieben, um zugucken, ob das ganze funktioniert.

    main.cpp

    C-Quellcode

    1. #include "SDL.h"
    2. #include "SDL_opengl.h"
    3. #include <iostream>
    4. using namespace std;
    5. int main (int argc, const char* argv[]) {
    6. if(SDL_Init(SDL_INIT_VIDEO) != 0) {
    7. cout << "Die SDL konnte nicht initialisiert werden (" << SDL_GetError() << ")" << endl;
    8. return 1;
    9. }
    10. cout << "Willkommen zum SDL Testprogramm." << endl;
    11. SDL_Quit();
    12. return 0;
    13. }
    Alles anzeigen



    Leider bekomme ich folgende Warnung beim Kompilieren: „warning: no previous prototype for function 'SDL_main' [-Wmissing-prototypes,3]”. Was mache ich falsch? :S



    // Falls das die falsche Themen-Kategorie ist, bitte ich um Entschuldigung, ich wusst nicht ganz, wo ich es hinpacken sollte..
  • Entferne mal alles, was Du nicht benötigst!

    Das OpenGL Include benötigst Du jetzt bestimmt noch nicht. Dann nimm mal den Namespace heraus und ersetze cout durch std::cout ebenso endl durch std::endl

    Was passiert dann?


    Bitte die komplette Fehlerausgabe anhängen! Da steht doch bestimmt drin, dass die Datei "SDL.h" nicht gefunden wird.
    goto fail;

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MarkusM ()

  • Hm.. hat sich auch bei folgendem Quellcode nichts geändert:

    C-Quellcode

    1. #include "SDL.h"
    2. #include <iostream>
    3. int main (int argc, const char* argv[]) {
    4. std::cout << "Willkommen zum SDL Testprogramm." << std::endl;
    5. return 0;
    6. }


    Fehlermeldung:

    Quellcode

    1. Undefined symbols for architecture x86_64:
    2. "_SDL_main", referenced from:
    3. -[SDLMain applicationDidFinishLaunching:] in SDLMain.o
    4. ld: symbol(s) not found for architecture x86_64
    5. clang: error: linker command failed with exit code 1 (use -v to see invocation)

    und folgende Warnung:

    Quellcode

    1. main.cpp:14:5: warning: no previous prototype for function 'SDL_main' [-Wmissing-prototypes,3]
  • Okay, aber wenn ich jetzt auf 32-Bit umstelle, meckert er, weil er das ganze nicht für i386 findet, aber das sollte die SDL doch unterstützen, ist heutzutage doch eigentlich Standard..
    Fehlermeldung:

    Quellcode

    1. Undefined symbols for architecture i386:
    2. "_SDL_main", referenced from:
    3. -[SDLMain applicationDidFinishLaunching:] in SDLMain.o
    4. ld: symbol(s) not found for architecture i386
    5. clang: error: linker command failed with exit code 1 (use -v to see invocation)


    Und welchen Vorteil hat es, wenn ich die SDL in ~/Library/Frameworks installiere?
  • Dann scheint irgend etwas anderes faul zu sein. Wenn Du Frameworks in den Benutzerordner installierst hat das den Vorteil, dass Du nicht versehentlich die systemweite Version überschreibst bzw. genau die von Dir gewünschte Version/Variante und nicht die zwischenzeitl von einem anderen Programm in /Library/Frameworks überschriebene. Generell solltest Du aber eine "copy files" build rule erstellen, die das benötigte Framework ins AppBundle kopiert (von ~/Library/Frameworks). Dann müssen sich Deine Benutzer um nix kümmern und Du benutzt automatisch die von Dir getestete Version.
  • Das klingt logisch.
    Ich habe jetzt nochmal das ganze Projekt gelöscht und es mit folgenden Schritten neu erstellt:
    Template: Command Line Tool->C++
    Von 64-Bit auf 32-Bit umgestellt
    SDL.framework hinzugefügt
    Cocoa.framework hinzugefügt
    SDLMain.h und SDLMain.m aus dem Ordner NIBless hinzugefügt
    Als Header Search Path ~/Library/Frameworks/SDL.framework/Headers (dort befindet sich jetzt die SDL) hinzugefügt.
    Kompiliert und es gab die selbe Fehlermeldung wie oben.

    Hilft dir das vlt. weiter?


    // EDIT: Achja inder main.cpp hab ich noch ein #include <SDL/SDL.h> eingefügt..

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ThePat ()

  • Es funktioniert endlich!! :DD

    Ich hab mich etwas durch die SDL Headers geklickt und mir angeguckt wie das ganze funktioniert, um vlt. den Fehler selber zu finden.
    Als ich dann in der SDL_main.h war sah ich folgende Zeielen:

    Quellcode

    1. /** The application's main() function must be called with C linkage,
    2. * and should be declared like this:
    3. * @code
    4. * #ifdef __cplusplus
    5. * extern "C"
    6. * #endif
    7. * int main(int argc, char *argv[])
    8. * {
    9. * }
    10. * @endcode
    11. */
    Alles anzeigen


    Und dann hab ich mir meine main angeschaut und die war aber schon von Apple so vorgegeben:

    Quellcode

    1. int main (int argc, const char* argv[])


    Nachdem ich das const entfernt habe, funktionierte alles einwandfrei :)


    Danke trotzdem an Markus, du ahst mir sehr sehr geholfen!! :)