2010-08-27 20 views
3

Cette question a été soulevée de nombreuses fois, mais Visual Studio ne cesse de me défier.Visual Studio Erreurs de liaison. Ordre dans lequel MFC, CRT inclus?

Nous avons une application qui devrait être autonome, c'est-à-dire ne pas dépendre de bibliothèques tierces. C'est pourquoi nous construisons tout de manière statique en utilisant les indicateurs de génération de code MT(d). L'application dépend de Qt, zlib, OpenSSL et DCMTK. Toutes ces bibliothèques ont été construites en tant que bibliothèques statiques avec MT(d). L'application utilise également du code lié à MFC, donc nous devons également faire un lien avec elle.

MFC est inclus via

#include <afxwin.h> 

Je lis quelque part que cela devrait être le premier inclure dans chaque fichier, mais je ne sais pas s'il est vrai. Quoi qu'il en soit, la ligne n'est pas incluse dans tous les fichiers, seul un fichier l'inclut.

Voici les erreurs liées à Link:

Error 24 error LNK2005: "void __cdecl operator delete[](void *)" ([email protected]@Z) already defined in LIBCMTD.lib(delete2.obj) uafxcwd.lib 
Error 22 error LNK2005: "void __cdecl operator delete(void *)" ([email protected]@Z) already defined in LIBCMTD.lib(dbgdel.obj) uafxcwd.lib 
Error 23 error LNK2005: "void * __cdecl operator new[](unsigned int)" ([email protected]@Z) already defined in libcpmtd.lib(newaop.obj) uafxcwd.lib 
Error 21 error LNK2005: "void * __cdecl operator new(unsigned int)" ([email protected]@Z) already defined in LIBCMTD.lib(new.obj) uafxcwd.lib 

Voici le linker output.

J'ai lu de nombreux threads sur de nombreux sites ainsi que ce article à partir de KB de MSDN. Mais ils ne m'aident pas, car ils continuent à dire que les librairies MFC devraient être liées avant CRT, mais je ne peux pas trouver un moyen de modifier l'ordre de liaison.

Toute aide est grandement appréciée.

Edit 1: en utilisant l'astuce de this thread permet de résoudre effectivement le problème, mais je veux toujours savoir ce qui ne va pas ici.

Edit 2: l'aide de Visual Studio 2008 SP1, Windows 7 et Qt 4.6.3

+0

Quelle version de Visual Studio utilisez-vous? – karlphillip

+0

visual studio 2008 sp 1 –

Répondre

0
+1

Ce qui est exactement ce que j'ai dit dans ma réponse 2 jours avant d'avoir de l'aide là-bas et est revenu pour poster cette réponse. – karlphillip

+0

Bon retour, @karlphillip! –

+0

@karlphillip Ce qui n'était pas évident pour @ak, et qui n'était pas évident pour moi non plus, c'est comment vous résolvez le problème une fois que vous le voyez dans la sortie '/ verbose: lib'. Pour moi, [this] (http://stackoverflow.com/a/1741416/149506) l'a fait. – pelesl

4

Le problème est clair: vous compilez CRT et le code MFC ensemble.

Lorsque vous utilisez les bibliothèques MFC, vous devez vous assurer qu'ils sont liés avant que la bibliothèque CRT est liée. Vous pouvez faire cela en s'assurant que chaque fichier dans votre projet comprend Msdev \ Mfc \ Include \ Afx.h d'abord, soit directement (#include) ou indirectement (#include). Le Afx.h fichier include force l'ordre correct des bibliothèques, en utilisant la directive:

#pragma comment (lib,"<libname>")

Microsoft has an article décrivant ce problème et propose 2 solutions (étape par étape):

  • Solution 1: Force Linker pour lier les bibliothèques dans l'ordre correct
  • Solution 2: Localiser et corriger le problème Module
+0

comment puis-je localiser le module problème? –

+0

@ak Ils décrivent comment le faire dans la page que j'ai pointée plus haut. Je vous suggère de l'ouvrir et de regarder de plus près. – karlphillip

+0

Dans cette solution deux, ils décrivent uniquement les étapes pour obtenir la sortie de l'éditeur de liens. Je l'ai déjà fait, la sortie de l'éditeur de liens est ici http://pastebin.com/9qWbnbC5, comme je l'ai mentionné dans la question. Mais je le regarde, et je ne peux que supposer que CRT est lié avant MFC, mais il n'y a aucune explication POURQUOI cela se produit ... –