Question

J'ai un message d'erreur vraiment étrange qui ne se produit que lorsque j'ajoute la ligne suivante à mon projet:

std::list<CRect> myVar;

Cela vaut la peine de noter qu'il ne doit pas nécessairement s'agir de std :: list, il peut s'agir de std :: vector ou de tout autre conteneur STL, je suppose.

Voici le message d'erreur:

  

Erreur 1 erreur LNK2005: " public:   __thiscall std :: list

     
    

:: list > (void) "     (?? 0? $ List @ VCRect @@ V? $ Allocator @ VCRect @@@ std @@@ std @@ QAE @ XZ)     déjà défini dans     SomeLowLevelLibrary.lib

  

La bibliothèque de bas niveau référencée dans le message d'erreur n'a aucune idée du projet que je construis, elle n'a que des fonctionnalités de bas niveau et ne traite pas les interfaces graphiques de niveau supérieur MFC.

Je peux obtenir l'erreur de l'éditeur de liens si je modifie la ligne de code en:

std::list<CRect*> myVar;

Mais je ne veux pas le pirater pour le plaisir.

De plus, peu importe que je crée la variable sur la pile ou le tas, je reçois toujours la même erreur.

Quelqu'un at-il des idées à ce sujet? J'utilise Microsoft Visual Studio 2008 SP1 sur Vista Enterprise.

Modifier: L'erreur de l'éditeur de liens ci-dessus concerne le fichier std :: list < > constructeur, je reçois également une erreur pour les fonctions destructor, _Nextnode et clear.

Modifier: Dans d'autres fichiers du projet, std :: vector ne sera pas lié, dans d'autres, il pourrait s'agir de std :: list. Je n'arrive pas à comprendre pourquoi certains conteneurs fonctionnent et d'autres pas. La liaison MFC est statique dans les deux bibliothèques. Dans la bibliothèque de bas niveau, nous avons 1 classe qui hérite de std :: list.

Modifier: La bibliothèque de bas niveau ne contient aucune classe héritant de CRect, mais elle utilise STL.

Était-ce utile?

La solution 2

Je suis récemment tombé sur cette erreur dans notre projet et j'ai décidé de mener une enquête plus approfondie que de la réparer avec un bidouillage comme la dernière fois (swap std :: list pour CArray). Il s’avère que l’une de nos bibliothèques de bas niveau héritait de std :: list, par exemple.

class LIB_EXPORT CRectList : public std::list<CRect>
{
};

Ce n’est pas seulement une mauvaise pratique, mais c’est aussi la cause des erreurs de l’éditeur de liens dans l’application principale. Je change CRectList pour envelopper std :: list plutôt que d’en hériter et l’erreur a disparu.

Autres conseils

Vous devriez regarder les paramètres de l'éditeur de liens, mais je ne peux pas dire immédiatement quels sont ceux. Il est normal que les instanciations LIST soient effectuées dans plusieurs fichiers. L'éditeur de liens devrait en choisir un. Ils sont tous identiques (en supposant que vous ayez des paramètres de compilateur cohérents).

Cela ne ressemble pas au symptôme exact, mais pour être sûr que vous devez vérifier que votre projet principal et toutes vos bibliothèques incluses utilisent le même " Bibliothèque d'exécution ". paramètre sous "C ++: Génération de code". Le mélange de ces paramètres peut créer des erreurs de liaison de bibliothèque d'exécution. (Ce qui me trouble dans votre cas, c'est que vous pouvez le faire disparaître en changeant le code, mais cela vaut la peine de vérifier si vous ne l'avez pas déjà fait.)

SomeLowLevelLibrary.lib contient-il ou utilise-t-il des classes nommées CRect? Est-ce qu'il utilise STL?

Le fichier est-il inclus dans un en-tête pouvant être compilé en deux modules de code distincts?

Une autre possibilité aléatoire a surgi dans ma tête aujourd'hui. Est-il possible que votre DLL actuelle et votre bibliothèque de bas niveau référencent deux versions différentes de MFC? Long shot.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top