11 votes

<section class="crt">. Section . Que signifie cette avertissement?

J'ai récemment reçu cet avertissement (VC++ 2010)

avertissement LNK4210 : la section .CRT existe ; il peut y avoir des initialisateurs ou des terminaux statiques non gérés

Je suppose que c'est la section critique. Cela fait un moment depuis mon cours sur les systèmes d'exploitation, donc je ne parviens pas vraiment à comprendre ce que cela signifie. Si je me souviens bien, la section critique travaille avec des ressources partagées. Alors, en quoi cet avertissement est-il lié et que signifie-t-il exactement ?

11voto

Hans Passant Points 475940

Non, CRT = C Run Time. Il s'agit d'une bibliothèque de support dont tout programme a besoin pour fonctionner. Des choses comme strcpy() s'y trouvent. Vous obtenez une section '.CRT' dans votre fichier .obj lorsque votre code contient des variables globales qui doivent être initialisées avant que votre programme ne démarre. Le CRT s'occupe de cela.

Ce n'est rien d'anormal. Le problème est que le "linker" n'a pas vu le CRT être lié à votre programme. Vous avez d'une manière ou d'une autre écrit du code qui n'avait pas de dépendance sur le code CRT, à part de l'exigence d'initialisation. Très étrange, je n'ai jamais entendu parler de quelqu'un ayant ce problème. Suivez la liste de contrôle dans la documentation pour voir si l'un d'eux correspond à votre cas.

8voto

Brian Kelly Points 9433

La documentation MSDN couvre assez bien cela:

Certain code introduce des initialiseurs statiques ou des terminaux, mais le CRT ou son équivalent (qui doit exécuter les initialiseurs statiques ou les terminaux) n'est pas exécuté lorsque l'application démarre. Voici quelques exemples de code qui pourraient causer cela:

  • Variable de classe globale avec un constructeur, un destructeur ou une table de fonctions virtuelles.
  • Variable globale initialisée avec une constante non connue à la compilation.

Pour résoudre ce problème:

  • Ajoutez msvcrtxx.lib, libc.lib, libcd.lib, libcmt.lib, ou libcmtd.lib à votre ligne de commande du linker, ou
  • Supprimez tout le code avec des initialiseurs statiques.
  • Ne pas utiliser /NOENTRY.

Je vous conseillerais donc de vérifier votre code pour récent ajout d'objets créés au niveau statique ou global. Si vous n'en trouvez pas, ils peuvent être cachés dans une bibliothèque tierce avec laquelle vous liez. De toute façon, la solution la plus probable sera de lier avec le CRT en utilisant la première suggestion dans la section "Pour résoudre ce problème" ci-dessus.

6voto

DivyaMaheswaran Points 372

Avertissement LNK4210 : la section .CRT existe ; il peut y avoir des initialiseurs statiques ou des terminaux non traités

Cette erreur est causée par la spécification du point d'entrée dans les propriétés du projet.

Suivez les étapes ci-dessous et voyez si votre erreur est résolue :

1.Cliquez avec le bouton droit sur votre projet dans l'explorateur de solutions (VS 2013)

2.Allez dans Propriétés - Toutes les configurations

3.Linkeur - Point d'entrée. Supprimez le point d'entrée si vous en avez spécifié un.

Il n'est pas nécessaire de spécifier le point d'entrée car BOOST_TEST détecte automatiquement le point d'entrée.

J'espère que cela aidera pour d'autres erreurs d'initialiseur également. Santé!

2voto

Max Points 87

J'ai eu le même problème en spécifiant manuellement une entrée "personnalisée" à ma DLL. J'ai supprimé cette entrée DLL personnalisée et j'utilise simplement le nom par défaut DLLMain et ça fonctionne à nouveau...étrange.

-1voto

tauruswang Points 25

LIBCMT.LIB pour initialiser les éléments liés au CRT.... Utiliser mainCRTStartup pour la fonction d'entrée, puis appeler _CRT_INIT explicitement.

link hello_world.obj Kernel32.lib UCRT.LIB legacy_stdio_definitions.lib LIBCMT.LIB /subsystem:console  /out:hello_world_basic.exe

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X