Partager via


Avertissement des outils Éditeur de liens LNK4049

le symbole 'symbol' défini dans 'filename.obj' est importé

__declspec(dllimport) a été spécifié pour le symbole , même si le symbole est défini dans le fichier objet filename.obj dans la même image. Supprimez le __declspec(dllimport) modificateur pour résoudre cet avertissement.

Notes

Cet avertissement est généré par l’éditeur de liens lorsque vous définissez un symbole dans un fichier objet et que vous le référencez à l’aide du __declspec(dllimport) modificateur de déclaration dans un autre.

Avertissement LNK4049 est une version plus générale d’avertissement des outils Éditeur de liens LNK4217. L’éditeur de liens génère un avertissement LNK4049 lorsqu’il ne peut pas déterminer la fonction ou le fichier objet référencé le symbole importé.

Les cas courants où LNK4049 est généré au lieu de LNK4217 sont les suivants :

  • Lorsque vous utilisez l’option /INCREMENTAL .

  • Lorsque vous utilisez l’option /LTCG .

Pour résoudre LNK4049, essayez l’une des procédures suivantes :

  • Supprimez le __declspec(dllimport) modificateur de la déclaration de transfert du symbole qui a déclenché LNK4049. Vous pouvez rechercher des symboles dans une image binaire à l’aide de l’utilitaire DUMPBIN . Le commutateur DUMPBIN /SY Mo OLS affiche la table de symboles COFF de l’image. Pour plus d’informations sur l’utilitaire DUMPBIN , consultez référence DUMPBIN.

  • Désactivez temporairement la liaison incrémentielle et l’optimisation de l’ensemble du programme. Lorsqu’elle est recompilée, l’application génère un avertissement LNK4217, qui inclut le nom de la fonction qui fait référence au symbole importé. Supprimez le modificateur de déclaration du symbole importé et réactivez la __declspec(dllimport) liaison incrémentielle ou l’optimisation du programme entier en fonction des besoins.

Bien que le code généré final se comporte correctement, le code généré pour appeler la fonction importée est moins efficace que d’appeler la fonction directement. Cet avertissement n’apparaît pas lorsque vous compilez à l’aide de l’option /clr .

Pour plus d’informations sur les déclarations d’importation et d’exportation de données, consultez dllexport, dllimport.

Exemple

La liaison des deux modules suivants génère LNK4049. Le premier module génère un fichier objet contenant une seule fonction exportée.

// LNK4049a.cpp
// compile with: /c

__declspec(dllexport) int func()
{
   return 3;
}

Le deuxième module génère un fichier objet contenant une déclaration de transfert vers la fonction exportée dans le premier module, ainsi qu’un appel à cette fonction à l’intérieur de la main fonction. La liaison de ce module au premier module génère LNK4049. Supprimez le __declspec(dllimport) modificateur de la déclaration pour résoudre l’avertissement.

// LNK4049b.cpp
// compile with: /link /WX /LTCG LNK4049a.obj
// LNK4049 expected

__declspec(dllimport) int func();
// try the following line instead
// int func();

int main()
{
   return func();
}

Voir aussi

Avertissement des outils Éditeur de liens LNK4217
Avertissement des outils Éditeur de liens LNK4286
dllexport, dllimport