Une erreur LNK2005 se produit lorsque la bibliothèque CRT et les bibliothèques MFC sont liées dans un ordre incorrect dans Visual C++

Traductions disponibles Traductions disponibles
Numéro d'article: 148652 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsque la bibliothèque CRT (C Run-Time) et les bibliothèques MFC (Microsoft Foundation Class) sont liées dans l'ordre incorrect, vous pouvez recevoir l'un des messages d'erreur LNK2005 suivants :
nafxcwd.lib(afxmem.obj) : erreur LNK2005:
"void * __cdecl operator new(unsigned int)"(??2@YAPAXI@Z) déjà
défini dans LIBCMTD.lib(new.obj)
nafxcwd.lib(afxmem.obj) : erreur LNK2005:
"void __cdecl operator delete(void *)"(??3@YAXPAX@Z) déjà défini
dans LIBCMTD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj) : erreur LNK2005:
"void * __cdecl operator new(unsigned int,int,char const *,int)"
(??2@YAPAXIHPBDH@Z) déjà défini dans LIBCMTD.lib(dbgnew.obj)
mfcs40d.lib(dllmodul.obj): erreur LNK2005: _DllMain@12 déjà défini dans
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj): erreur LNK2005: _DllMain@12 déjà défini dans
msvcrtd.lib(dllmain.obj)

Cause

Les bibliothèques CRT utilisent une liaison externe faible pour les fonctions new, delete et DllMain. Les bibliothèques MFC contiennent également les fonctions new, delete et DllMain. Ces fonctions requièrent que les bibliothèques MFC soient liées avant que la bibliothèque CRT soit liée.

Résolution

Trois méthodes permettent de résoudre ce problème : la première solution consiste à forcer l'éditeur de liens à lier les bibliothèques dans l'ordre correct. La deuxième solution vous permet de trouver le module qui est la cause du problème et de le corriger.

Remarque Les étapes suivantes sont basées sur Visual C++ 6.0.

Première solution : Forcer l'éditeur de liens à lier les bibliothèques en ordre correct

  1. Dans le menu Projet, cliquez sur Paramètres.
  2. Dans l'affichage Paramètres pour de la boîte de dialogue Paramètres du projet, cliquez pour sélectionner la configuration de projet sujette aux erreurs de liens.
  3. Sous l'onglet Lien, sélectionnez Entrée dans la zone de liste déroulante Catégorie.
  4. Dans la zone Ignorer les bibliothèques, insérez les noms de bibliothèque (par exemple, Nafxcwd.lib;Libcmtd.lib).

    Remarque L'équivalent en ligne de commande de l'éditeur de liens est /NOD:<nom bibliothèque>.
  5. Dans la zone Modules objet/bibliothèque, insérez les noms de bibliothèques. Vous devez vous assurer que ceux-ci sont répertoriés dans l'ordre et sont les deux premières bibliothèques sur la ligne (par exemple, Nafxcwd.lib Libcmtd.lib).
Pour définir cette option dans Visual C++ .NET, consultez la rubrique d'aide en ligne « Définition des propriétés de projet Visual C++ ».

Deuxième solution : Localiser et corriger le module qui pose problème

Pour afficher l'ordre actuel des liens de la bibliothèque, procédez comme suit :
  1. Dans le menu Projet, cliquez sur Paramètres.
  2. Dans l'affichage Paramètres pour de la boîte de dialogue Paramètres du projet, cliquez pour sélectionner la configuration de projet sujette aux erreurs de liens.
  3. Sous l'onglet Lien, tapez /verbose:lib dans la zone Options du projet.
  4. Régénérer votre projet. Les bibliothèques seront répertoriées dans la fenêtre de sortie pendant le processus de liaison.

Statut

Ce comportement est voulu par la conception même du produit.

Plus d'informations

Lorsque vous utilisez les bibliothèques MFC, vous devez vous assurer qu'elles sont liées avant que la bibliothèque CRT ne soit liée. Pour cela, assurez-vous que chaque fichier dans votre projet inclut en premier Msdev\Mfc\Include\Afx.h, soit directement (#include <Afx.h>) ou indirectement (#include <Stdafx.h>). Le fichier Include Afx.h force l'ordre correct des bibliothèques, en utilisant la directive #pragma comment (lib,"<libname>").

Si le fichier source a une extension .c, ou le fichier a une extension .cpp mais n'utilise pas MFC, vous pouvez créer et inclure un petit fichier d'en-tête (Forcelib.h) au début du module. Ce nouvel en-tête s'assure que l'ordre de recherche de la bibliothèque est correct.

Visual C++ ne contient pas ce fichier d'en-tête. Pour créer ce fichier, procédez comme suit :
  1. Ouvrez Msdev\Mfc\Include\Afx.h.
  2. Sélectionnez les lignes entre #ifndef _AFX_NOFORCE_LIBS et #endif //!_AFX_NOFORCE_LIBS.
  3. Copiez la sélection dans le Presse-papiers Windows.
  4. Créez un nouveau fichier texte.
  5. Collez le contenu du Presse-papiers dans ce nouveau fichier.
  6. Enregistrez le fichier en tant que Msdev\Mfc\Include\Forcelib.h.

Étapes pour reproduire le problème dans Visual C++ .NET

  1. Démarrez Microsoft Visual Studio .NET.
  2. Dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Projet.
  3. Cliquez sur Projets Visual C++ sous Types de projets, puis cliquez sur Application MFC sous Modèles.
  4. Dans la zone de texte Nom, tapez Q148652.
  5. Dans la zone de texte Emplacement, tapez C:\Test, puis cliquez sur OK.
  6. Dans la boîte de dialogue Assistant Application MFC, cliquez sur Type d'application.
  7. Cliquez sur Basée sur une boîte de dialogue sous Type d'application, puis cliquez sur Utiliser les MFC dans une bibliothèque statique sous Utilisation des MFC.
  8. Cliquez sur Terminer.
  9. Dans l'Explorateur de solutions, sous Source Files sélectionnez les trois fichiers .cpp.
  10. Cliquez avec le bouton droit sur les trois fichiers sélectionnés, puis cliquez sur Supprimer.
  11. Cliquez avec le bouton droit sur Source Files, pointez sur Ajouter, puis cliquez sur Ajouter un nouvel élément.
  12. Cliquez sur Fichiers C++ sous Modèles. Dans la zone de texte Nom, tapez Aa. Cliquez sur Ouvrir.
  13. Collez le code suivant dans le fichier Aa.cpp :
    int test(){new int; return 1;}
  14. Cliquez avec le bouton droit sur Source Files, pointez sur Ajouter, puis cliquez sur Ajouter un élément existant.
  15. Sélectionnez les fichiers suivants :
    • Q148652.cpp
    • Q148652Dlg.cpp
    • stdafx.cpp
  16. Cliquez sur Ouvrir.
  17. Les fichiers que vous avez sélectionnés à l'étape 15 apparaissent sous Source Files.
  18. Sélectionnez les quatre fichiers .cpp sous Source Files.
  19. Cliquez avec le bouton droit sur les quatre fichiers .cpp que vous avez sélectionnés, puis cliquez sur Propriétés.
  20. Développez Propriétés de configuration, puis C/C++.
  21. Cliquez sur En-têtes précompilés.
  22. Définissez la propriété Création/utilisation d'un en-tête précompilé à Sans utiliser les en-têtes précompilés. Cliquez sur OK.
  23. Dans le menu Générer, cliquez sur Régénérer la solution.

Propriétés

Numéro d'article: 148652 - Dernière mise à jour: lundi 30 janvier 2006 - Version: 6.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C++ 4.0 Édition Standard
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 5.0 Édition Entreprise
  • Microsoft Visual C++ 6.0 Édition Entreprise
  • Microsoft Visual C++ 5.0 Édition Professionnelle
  • Microsoft Visual C++ 6.0 Édition Professionnelle
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET 2002 Initiation
  • Microsoft Visual C++ .NET 2003 Initiation
Mots-clés : 
kberrmsg kbtshoot kbprb kbarttypeinf KB148652
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com