SDL et C++

Mac Shiloh

Membre confirmé
20 Février 2003
29
1
Bonsoir tout le monde !
J'ai enfin fini mon projet en C++ dont je vous avais soumis quelques problèmes il y a quelques semaines. Par contre, le projet est en ligne de commande. Comme il me reste un peu de temps avant de le rendre, je me suis dit que ce serait plus sympa d'y apporter du graphisme comme c'est un jeu (meme si on nous en demande pas tant). Je me suis naturellement tourné vers la librairie SDL qui existe sur toutes les plateformes. Mais j'ai l'impression de ne pas pouvoir utiliser cette librairie avec le C++ sous xCode: je n'arrive pas à compiler mon projet en ayant simplement inclus le framework SDL et en ayant inclus <STD/STD.H> dans le main: j'ai l'erreur suivant au linking
en mode Deployement:
Undefined symbols: _main

Et en créant une application SDL, je remarque qu'il crée une classe SDL_main qui est écrite en Objective-C.
D'où ma question: est-ce que l'on peut écrire une application avec SDL qui soit en C++ et qui soit portable, c'est-à-dire en utilisant le C++ standard et la librairie SDL ?
 
Tu dis en mode "Deployment". Est-ce que cela link en mode "Development" ?
Si oui, arrive-t-il à trouver le framework SDL en mode "Deployment" ? Peut être un problème de library path ? Est ce que ton framework est copié dans ~/Library/Frameworks ? As tu des infos visibles dans la console ?

J'avais essayé il y a quelque temps SDL sur ProjectBuilder et il me semble avoir eu les mêmes problèmes. Mais à la fin j'avais réussi à lancer l'appli mais en mode "Development".
 
En mode Deployement, ca link bien mais l'appli ne se lance pas. J'ai une erreur de signal 6: ZeroLink: unknown symbol '_main'. Apparamment, il trouve la librairie SDL et celle-ci se trouve bien dans le dossier que tu m'as dit.
 
J'ai retrouvé le projet que j'avais testé à l'époque. Effectivement j'ai le même problème à l'exécution avec un petit détail : il est précisé que c'est un problème avec Zerolink.
Pour désactiver cette option, il faut sélectionner le projet dans la barre latérale, faire Pomme+I et décocher l'option Zerolink.

Maintenant j'ai une autre erreur au link :
ld: /usr/lib/crt1.o illegal reference to symbol: __objcInit defined in indirectly referenced dynamic library /usr/lib/libobjc.A.dylib

PS : la compile et l'exécution marche très bien en mode ligne ;)

Je continue d'investiguer vu que je voulais me mettre à une appli multiplateform avec cette lib.
 
J'ai trouvé : j'ai récupéré la dernière version du SDL dev kit (1.2.7) qui fournit des templates xcode (4 différents). Quand tu crées un projet avec le template SDL Application (application c standard), xcode génère un main.c et un SDLMain.m. Apparemment ce dernier est obligatoire pour pouvoir compiler sous xcode. J'ai trouvé la confirmation sur un forum. Pour la portabilité, il semble qu'il suffise de ne pas tenir compte de ce fichier .m quand tu compiles pour une autre plateforme.

Pour l'erreur sur ct1.o, il faut inclure le framework Foundation même si tu ne fais pas de cocoa.
 
Je te remercie d'avoir chercher autant mais je dois être maudit ou alors pas très doué parce que ça marche toujours pas !
J'ai essayé de deux manières de faire ce que tu m'as dit et rien n'y fait:
- J'ai d'abord créé un projet SDL Application (étant une application c standard d'après toi) puis j'y ai mis tous mes fichiers source dedans. En incluant seulement SDL/SDL.h, j'ai environ 74 erreurs et 44 warnings, ce qui fait beaucoup à mon goût. Je pense que toutes ces erreurs sont du à une erreur de langage: xCode attend de l'Objective C pour ce projet.
- J'ai ensuite tenté de reprendre mon projet en y ajoutant le framework SDL et le framework Foundation comme tu me l'as recommandé. J'ai aussi ajouté SDLMain.m et SDLMain.h. Et là, erreur au linking: illegal reference to symbol: .obj_class_name_NSAppleMenuController defined in indirectly referenced dynamic library /System/Library/Frameworks/AppKit.framework/...
Voyant ça, je me dis qu'il faut aussi que j'ajoute le framework AppKit.
Mais même en croisant les doigts, ça ne passe pas: Undefined symbols: _SDL_main. Je comprend pas puisque j'ai bien ajouté SDLMain.m
Tu pourrais me dire plus en détails comment tu as fait pour que ton projet marche parce qu'il doit y avoir des étapes qui me manquent.
 
J'ai tout simplement créer un projet "SDL Application". Il comprend main.c, SDLMain.m et SDLMain.h, ainsi que les framework Cocoa, Fondation et AppKit. Le framework SDL n'est pas dans le projet mais il est intégré au link.
Ce projet de base crée une fenetre avec un fond noir quand il démarre.

Es-tu parti d'un projet "SDL Application" vide ou as-tu ajouté ce qui te semblait nécessaire à ton projet ? A ce moment il te manque surement le link avec le framework SDL.

Essaies déjà un projet tout neuf, tout propre et remets ensuite tes fichiers dedans.
 
Eh bien c'est exactement ce que j'ai fait dans la première manière que je t'ai décrit dans mon messag précédent. Par aquis de conscience, je viens de recommencer en faisant exactement ce que tu m'as diT. Dès que je n'utilise pas les classes que j'ai défini, ca compile normalement. Mais dès que je fais un include d'une de mes classes, j'ai des dizaines de warning et d'erreurs du style: parse error before Object sur la ligne: class Object{, il reconnait pas virtual, ..., Toutes des erreurs comme ca qui me font penser que le compilateur attend de l'Objective C et pas du C++.
Tu as réussi à faire marcher ton projet ?
 
Essaies de renommer SDLMain.m en SDLMain.mm. Comme cela le compilateur comprendra que tu veux faire de l'objective-C++.

Rectification : renommes main.c en main.cpp.
 
Merci :D

Je fais du SDL en C++ \o/

Je rajouterais qu'il faut le renommer dans le finder et pas dans xcode puis faire "add existing file" dans xcode.