undefined reference to `WinMain@16'
Quand j'essaie de compiler un programme utilisant Eclipse CDT
, je reçois le texte suivant:
/mingw/lib/libmingw32.un(principale.o):principal.c:(.texte+0x106):
undefined reference to `WinMain@16
Pourquoi est-ce? Et, comment puis-je résoudre ce problème?
Vous devez vous connecter pour publier un commentaire.
Envisager la suite de l'API Windows au niveau du programme:
Maintenant, nous allons le construire à l'aide de GNU toolchain (c'est à dire g++), aucune des options spéciales. Ici
gnuc
est juste un fichier de commandes que j'ai utilisé pour cela. Il fournit seulement des options pour faire des g++ standard:Cela signifie que l'éditeur de liens produite par défaut un console de sous-système exécutable. Le sous-système valeur dans le fichier d'en-tête indique à Windows ce services le programme nécessite. Dans ce cas, avec le système de la console, que le programme nécessite une fenêtre de console.
Cela provoque également l'interprète de commande à attendre que le programme complet.
Maintenant, nous allons construire avec GUI sous-système, ce qui signifie simplement que le programme ne nécessite pas une fenêtre de console:
J'espère que c'est OK pour l'instant, bien que la
-mwindows
drapeau est seulement semi-documenté.Bâtiment sans que semi-documenté drapeau on aurait plus spécifiquement dire à l'éditeur de liens qui sous-système de valeur de ses désirs, et certaines API de Windows bibliothèques d'importation sera alors en général doivent être spécifiés explicitement:
Qui a bien fonctionné, avec la chaîne d'outils GNU.
Mais quel est le Microsoft de la chaîne, c'est à dire de Visual C++?
Bien, bâtiment comme une console de sous-système exécutable fonctionne très bien:
Cependant, avec Microsoft chaîne d'outils de construction sous le GUI sous-système ne fonctionne pas par défaut:
Techniquement, c'est parce que Microsoft est l'éditeur de liens est non-standard par défaut pour les interfaces du sous-système de. Par défaut, lorsque le système est en GUI, alors Microsoft est l'éditeur de liens utilise une bibliothèque d'exécution point d'entrée, la fonction où la machine d'exécution de code commence, appelé
winMainCRTStartup
, qui appelle Microsoft non standard de laWinMain
au lieu de la normemain
.Pas grand-chose pour remédier à cela, cependant.
Tout ce que vous avez à faire est de dire de Microsoft, l'éditeur de liens qui de point d'entrée à utiliser, à savoir
mainCRTStartup
, qui appelle normemain
:Pas de problème, mais très fastidieux. Et si obscur et caché que la plupart des programmeurs Windows, qui la plupart du temps que de l'utilisation de Microsoft non-standard par défaut des outils, ne savent même pas à ce sujet, et pense à tort que l'une interface utilisateur Windows de sous-programme “doit” non standard
WinMain
au lieu de la normemain
. Au passage, avec C++0x Microsoft d'avoir un problème avec cela, puisque le compilateur doit alors annoncer qu'il est gratuit ou hébergé (lorsqu'il est hébergé, il doit supporter la normemain
).De toute façon, c'est la raison pour laquelle g++ peut se plaindre
WinMain
manquant: c'est un idiot non-standard de la fonction de démarrage de Microsoft outils nécessitent par défaut pour les interfaces du sous-système de programmes.Mais comme vous pouvez le voir ci-dessus, g++ n'a pas de problème avec la norme
main
même pour une interface graphique sous-programme.Donc, ce que pourrait être le problème?
Bien, vous êtes probablement manquant un
main
. Et vous avez probablement aucune (bonne)WinMain
soit! Et puis g++, après avoir cherchémain
(pas de tel), et Microsoft non standard de laWinMain
(qui n'), les rapports que ce dernier est absent.Tests avec une source de vide:
All you have to do is to tell Microsoft's linker which entry point to use, namely mainCRTStartup, which calls standard main
. Est-il un moyen de le faireEclipse CDT
que je ne suis pas en utilisant la ligne de commande. Mercimain
ou unWinMain
, ou, assurez-vous que le fichier est inclus dans le projet. Cheers,main
ouwinmain
? Mercimain
fonction. Vous avez besoin dans votre programme (mais avec un autre corps). Ou, vous pouvez utiliser un non-standard de MicrosoftWinMain
, mais vous avez besoin de l'un d'entre eux, et le fichier doit être inclus dans le projet.Pour résumer le post ci-dessus par des Acclamations et hth. - Alf, assurez-vous d'avoir
main()
ouWinMain()
défini et g++ doit faire la bonne chose.Mon problème est que l'
main()
a été définie à l'intérieur d'un espace de noms par accident.Je rencontre cette erreur lors de la compilation de mon application avec la SDL. Ceci a été causé par SDL définition propre à sa fonction principale dans SDL_main.h. Pour éviter SDL définir la fonction principale d'un SDL_MAIN_HANDLED macro doit être défini avant la SDL.h en-tête est inclus.
Essayez d'enregistrer votre .c fichier avant de l'immeuble. Je crois que votre ordinateur fait référence à un chemin d'accès à un fichier ne contenant aucune information à l'intérieur d'elle.
--Eu le même problème lors de la construction de projets C