Partager via


Avertissement des outils Éditeur de liens LNK4221

Ce fichier objet ne définit pas de symboles publics précédemment non définis. Il ne sera donc pas utilisé par une opération de lien qui consomme cette bibliothèque.

Tenez compte des deux extraits de code suivants : a.cpp

// a.cpp
#include <atlbase.h>

Et b.cpp :

// b.cpp
#include <atlbase.h>
int function()
{
   return 0;
}

Pour compiler les fichiers et créer deux fichiers objet, exécutez à cl /c a.cpp b.cpp l’invite de commandes. Si vous liez les fichiers objet en exécutant link /lib /out:test.lib a.obj b.obj, vous recevrez l’avertissement LNK4221. Si vous liez les objets en cours d’exécution link /lib /out:test.lib b.obj a.obj, vous ne recevrez pas d’avertissement.

Aucun avertissement n’est émis dans le deuxième scénario, car l’éditeur de liens fonctionne de manière à ce qu’il fonctionne de manière de premier sorti (LIFO). Dans le premier scénario, b.obj est traité avant a.objet a.obj n’a pas de nouveaux symboles à ajouter. En demandant à l’éditeur de liens de traiter a.obj en premier, vous pouvez éviter l’avertissement.

Une cause courante de cette erreur est lorsque deux fichiers sources spécifient l’option /Yc (Créer un fichier d’en-tête précompilé) avec le même nom de fichier d’en-tête spécifié dans le champ En-tête précompilé. Une cause courante de ce problème concerne pch.h , car, par défaut, pch.cpp inclut pch.h et n’ajoute aucun nouveau symbole. Si un autre fichier source inclut pch.h /Yc et que le fichier associé .obj est traité avant pch.obj, l’éditeur de liens lève LNK4221.

Une cause courante de cette erreur est lorsque deux fichiers sources spécifient l’option /Yc (Créer un fichier d’en-tête précompilé) avec le même nom de fichier d’en-tête spécifié dans le champ En-tête précompilé. Une cause courante de ce problème concerne stdafx.h , car, par défaut, stdafx.cpp inclut stdafx.h et n’ajoute aucun nouveau symbole. Si un autre fichier source inclut stdafx.h /Yc et que le fichier associé .obj est traité avant stdafx.obj, l’éditeur de liens lève LNK4221.

Une façon de résoudre ce problème est de s’assurer que pour chaque en-tête précompilé, il n’existe qu’un seul fichier source qui l’inclut avec /Yc. Tous les autres fichiers sources doivent utiliser des en-têtes précompilés. Pour plus d’informations sur la modification de ce paramètre, consultez /Yu (Utiliser le fichier d’en-tête précompilé).