Partager via


Avertissement des outils Éditeur de liens LNK4210

section section existe ; il peut y avoir des initialiseurs statiques non gérés ou des terminateurs

Notes

Certains codes ont introduit des initialiseurs statiques ou des terminateurs, mais le code de démarrage de la bibliothèque VCRuntime ou son équivalent (qui doit exécuter les initialiseurs statiques ou les terminateurs) n’est pas exécuté au démarrage de l’application. Voici quelques exemples de code nécessitant des initialiseurs statiques ou des terminateurs :

  • Variable de classe globale avec un constructeur, un destructeur ou une table de fonctions virtuelles.

  • Variable globale initialisée avec une constante au moment de la compilation.

Pour résoudre ce problème, essayez l’une des options suivantes :

  • Supprimez tout le code avec des initialiseurs statiques.

  • N’utilisez pas /NOENTRY. Après avoir supprimé /NOENTRY, vous devrez peut-être également supprimer /NODEFAULTLIB de votre ligne de commande de l’éditeur de liens.

  • Si votre build utilise /MT, ajoutez libcmt.lib, libvcruntime.lib et libucrt.lib à votre ligne de commande de l’éditeur de liens. Si votre build utilise /MTd, ajoutez libcmtd.lib, vcruntimed.lib et libucrtd.lib.

  • Lorsque vous passez de la compilation /clr :pure à /clr, supprimez l’option /ENTRY de la ligne de l’éditeur de liens. Cela permet l’initialisation CRT et permet aux initialiseurs statiques d’être exécutés au démarrage de l’application. L’option /clr :pure compiler est déconseillée dans Visual Studio 2015 et non prise en charge dans Visual Studio 2017.

L’option du compilateur /GS nécessite l’initialisation par la __security_init_cookie fonction. Cette initialisation est fournie par défaut dans le code de démarrage de la bibliothèque VCRuntime qui s’exécute ._DllMainCRTStartup

  • Si votre projet est généré à l’aide de /ENTRY et si /ENTRY est passé une fonction autre que _DllMainCRTStartup, la fonction doit appeler _CRT_INIT pour initialiser le CRT. Cet appel seul n’est pas suffisant si votre DLL utilise /GS, nécessite des initialiseurs statiques ou est appelé dans le contexte du code MFC ou ATL. Pour plus d’informations, consultez les DLL et le comportement de la bibliothèque d’exécution Visual C++.

Voir aussi