Undefined reference to 'SDL_main'
J'ai récemment décidé d'essayer de travailler avec SDL avec CodeBlocks 10.05. J'ai commencé avec le tutoriel sur http://www.sdltutorials.com/sdl-tutorial-basics et fait de mon mieux pour la suivre. Malheureusement, je rencontre:
..\..\..\..\..\..\SDL\SDL-1.2.15\lib\libSDLmain.a(SDL_win32_main.o):SDL_win32_main.c|| undefined reference to `SDL_main'|
quand j'essaie de le compiler.
J'ai cherché à travers de nombreuses questions sur ce site et d'autres tutoriels (principalement le tutoriel sur LazyFoo et la CodeBlocks wiki) et n'arrive pas à trouver une solution.
- C:\SDL\SDL-1.2.15\include a été ajouté dans le Compilateur onglet (Annuaires de Recherche)
- C:\SDL\SDL-1.2.15\lib a été ajouté dans l'éditeur de liens onglet
- Les bibliothèques libmingw32.une, libSDLmain.une, libSDL.dll.un sont liés dans l'ordre
- libmingw32.a partir de la MinGW\lib dans le dossier de CodeBlocks répertoire d'installation
- SDL.dll est à la fois dans le dossier System32 et dans le dossier du projet
Lors de la tentative de suivre le tutoriel sur le CodeBlocks wiki, on m'a dit que SDL.h n'a pas pu être trouvé dans le répertoire donné (lors d'un nouveau projet SDL).
CApp.cpp
#include "CApp.h"
#include "SDL\SDL.h"
CApp::CApp(){
Surf_Display=NULL;
Running=true;
}
int CApp::OnExecute(){
if (OnInit()==false){
return -1;
}
SDL_Event Event;
while (Running){
while (SDL_PollEvent(&Event)){
OnEvent(&Event);
}
OnLoop();
OnRender();
}
OnCleanup();
return 0;
}
int main(int argc, char* argv[]){
CApp theApp;
return theApp.OnExecute();
}
L'acpp.h
#ifndef CAPP_H_INCLUDED
#define CAPP_H_INCLUDED
#include "SDL\SDL.h"
class CApp{
private:
bool Running;
SDL_Surface* Surf_Display;
public:
CApp();
int OnExecute();
public:
bool OnInit();
void OnEvent(SDL_Event* Event);
void OnLoop();
void OnRender();
void OnCleanup();
};
#endif //CAPP_H_INCLUDED
SI vous avez besoin de fournir
Je suis désolé, pourriez-vous expliquer ce que vous entendez par là? Je suis relativement nouveau à la programmation et à ne pas tout comprendre. Est-ce que avez à faire avec mon installation de la SDL (Liaison et autres joyeusetés) ou est-il un problème dans le code? Merci!
Jamais l'esprit, je vois ce qui est fait dans SDL_main.h
Il faut que ce soit quelque chose qui manque dans votre éditeur de liens de l'installation. La façon dont vous l'avez décrit, il devrait fonctionner (et, en effet, que, du moins pour moi).
J'ai juste essayé de refaire tous les reliant à la suite de ce tutoriel à l'énoncé ainsi que les points énumérés ci-dessus. De procédure pas à pas ce que j'ai fait: - Téléchargé SDL-1.2.15-win32-x64.zip (64-bit de Windows) et SDL-devel-1.2.15-mingw32.tar.gz (Mingw32) à partir du site web de SDL. - Extrait le premier dans la C:\SDL et a placé l'SDL.dll à partir de la deuxième dans le dossier du projet et system32 - Ajouté le \include et \lib dans le compilateur et l'éditeur de liens onglets respectivement Liés libmingw32.une, libSDLmain.un, et libSDL.dll.un dans cet ordre.
SDL_main
, au lieu d'avoir un main
vous avez un SDL_main
Je suis désolé, pourriez-vous expliquer ce que vous entendez par là? Je suis relativement nouveau à la programmation et à ne pas tout comprendre. Est-ce que avez à faire avec mon installation de la SDL (Liaison et autres joyeusetés) ou est-il un problème dans le code? Merci!
Jamais l'esprit, je vois ce qui est fait dans SDL_main.h
Il faut que ce soit quelque chose qui manque dans votre éditeur de liens de l'installation. La façon dont vous l'avez décrit, il devrait fonctionner (et, en effet, que, du moins pour moi).
J'ai juste essayé de refaire tous les reliant à la suite de ce tutoriel à l'énoncé ainsi que les points énumérés ci-dessus. De procédure pas à pas ce que j'ai fait: - Téléchargé SDL-1.2.15-win32-x64.zip (64-bit de Windows) et SDL-devel-1.2.15-mingw32.tar.gz (Mingw32) à partir du site web de SDL. - Extrait le premier dans la C:\SDL et a placé l'SDL.dll à partir de la deuxième dans le dossier du projet et system32 - Ajouté le \include et \lib dans le compilateur et l'éditeur de liens onglets respectivement Liés libmingw32.une, libSDLmain.un, et libSDL.dll.un dans cet ordre.
OriginalL'auteur Prismriver | 2012-05-29
Vous devez vous connecter pour publier un commentaire.
La seule raison plausible pour votre problème je pense est que lorsque vous avez créé le fichier avec
main
, vous avez oublié de l'ajouter à construire des objectifs.Vous devriez voir CApp.cpp dans la liste où mon main.cpp est. Cliquez droit dessus et cliquez sur Propriétés. Cliquez sur l'onglet créer, dans la fenêtre qui apparaît. Vous devriez voir ceci:
Cliquez sur OK, appuyez sur Ctrl+F11 (Reconstruire).
Bonne chance.
Apparemment, cette syntaxe exacte/signature pour le
main
fonction est nécessaire. Si vous venez d'utiliserint main() { }
comme de nombreux compilateurs de soutien, il ne fonctionne pas. Si quelqu'un sait pourquoi, s'il vous plaît laissez-moi savoir.OriginalL'auteur jrok
Essayer
#undef main
après tout SDL têtes de.Mise à jour. Ce n'est pas une solution valable!
Comme l'a souligné HolyBlackCat, c'est une question assez bâclée correctif. SDL remplace la fonction principale dans le but d'effectuer une initialisation et/ou de nettoyage qui par ailleurs n'est pas possible, et puis appelle de nouveau à la réelle fonction de l'utilisateur.
L'interception travaille en remplaçant le nom de l'utilisateur de la fonction principale à
SDL_main
, avec une macro simpleDe l'utilisateur en fonction de cesse alors d'être le point d'entrée de l'application, et un point d'entrée fournies par SDL est utilisé. Le projet de
#undef
désactive l'interception témérairement et on devrait valoir qu'il n'est pas censé travailler à tous. Pour ceux qui compilé avec succès et a couru un SDL application après cette "solution", il doit avoir tout simplement été une plate-forme dépendant de la coïncidence.La bonne solution pour l'OP, l'erreur est de s'assurer que le fichier contenant
main
sera compilé et lié, et que la fonction a la bonne signature. Comme déjà signalé par d'autres.TU te moques... je souhaite que j'ai trouvé ce une heure plus tôt. Travaillé sur OSX.
yep, celui-ci a travaillé aussi sur Windows
Pourquoi cela est-il résoudre le problème??
Même si elle semble fonctionner, on ne devrait pas le faire. SDL a
#define main SDL_main
parce qu'il a besoin de faire quelques initialisation dansmain()
avant d'exécuter le code de l'utilisateur. Il peut ou peut ne pas fonctionner si vous fossé de cette initialisation.OriginalL'auteur Marcin Kaczmarek
mettre ces arguments à la fonction principale. J'ai eu ce problème aussi, et j'ai corrigé quelques secondes plus tôt.
int main(int argv, char** args)
{
}
C'est de la magie. A fonctionné pour moi!
Merci! Toute personne désireuse/en mesure d'expliquer pourquoi cela fonctionne (@ me s'il vous plaît)?
cette signature est requise, car SDL modifie par défaut du point d'entrée du programme résoudre. Dans des circonstances normales, vous pouvez utiliser l'une des nombreuses signatures pour la fonction principale,
int main()
,void main()
,int main(int, char**)
, etc. Le compilateur acceptera toutes ces variantes. Mais SDL intercepte le principal point d'entrée, comme indiqué dans ma réponse, et les appels de votre point d'entrée attendent une signature spécifique, qui n'est plus soumis à compilateur interprétation.OriginalL'auteur Ellias Mustellar