web-dev-qa-db-fra.com

SDL2: LNK1561: le point d'entrée doit être défini

Je veux compiler ce code:

#include <SDL.h>

int main(int argc, char* argv[]) {
    return 0;
}

Mais cela ne peut pas être lié: Error 1 error LNK1561: entry point must be defined

Il existe un code étrange dans cette bibliothèque: http://hg.libsdl.org/SDL/file/75726efbf679/include/SDL_main.h

#define main    SDL_main

J'ai aussi ajouté SDL2.lib;SDL2main.lib à Paramètres du projet => Éditeur de liens => Entrée.

Que puis-je faire pour exécuter ce projet?
VS 2012 SP3, projet C++ vide.

16
DmitryR

Selon ce fil sur Dream.In.Code:

Cliquez avec le bouton droit sur le nom du projet -> Propriétés -> Développez l'onglet Éditeur de liens -> Système -> Sous-système: assurez-vous qu'il s'agit de Console (/SUBSYSTEM:CONSOLE)

Si vous souhaitez masquer la fenêtre de la console ou si vous êtes en train de débuter une application multithread , vous devez définir le sous-système sur Window (/SUBSYSTEM:WINDOW).

40
4pie0

J'ai trouvé que la configuration/SOUS-SYSTEME: CONSOLE ne représente que la moitié de la solution. La seconde moitié consiste à ajouter SDL_MAIN_HANDLED à vos définitions supplémentaires. L’indice que j’ai utilisé pour résoudre ce problème se trouve dans SDL_main.h . Définissez SDL_MAIN_HANDLED pour indiquer aux fichiers d'en-tête SDL que vous avez déjà fourni une fonction main et ne souhaitez pas que celle-ci redéfinisse son propre point d'entrée.

3
dpiron

NE PAS#undef main! Bien que ce soit une très mauvaise pratique du côté de SDL de le redéfinir, ils ont de bonnes raisons: WinMain est défini du côté de la bibliothèque et utilisé pour exécuter du code init, ce qui aide à résoudre les problèmes de compatibilité. (encore plus lorsque vous utilisez différentes implémentations SDL, comme Steam ou le portage sur d'autres plateformes comme Android)

Alors, que devrais-tu faire? Sous Windows, vous devez toujours inclure SDL2main.lib avant SDL2.lib et assurez-vous que votre fichier principal est au format suivant:

int main(int argc, char* argv[]) // CORRECT
void main(int argc, char* argv[]) // WRONG
int main(int, char**) // MAY BE CORRECT

Source: SDL2 Windows FAQ

2
Gustavo Maciel

Comme l'a écrit tinky_winki

Faites un clic droit sur le nom du projet -> Propriétés -> Développez l’onglet Linker -> Système -> Sous-système: assurez-vous qu'il s'agit de la console (/ SUBSYSTEM: CONSOLE)

Mais si vous ne vous attendez pas à une console avec fenêtre, utilisez simplement,/SUBSYSTEM: WINDOWS  

2
Łukasz Mleczko

Projet >> Propriétés >> Éditeur de liens >> Avancé >> point d’entrée = main .__ et appliquer

0
Michał Rugbuś