Frage

Ich habe eine wirklich seltsame Fehlermeldung bekommt, das nur auftritt, wenn ich die folgende Zeile in meinem Projekt hinzufügen:

std::list<CRect> myVar;

Es ist erwähnenswert, dass es keine std :: Liste sein muss, kann es std :: vector oder jeder anderen STL-Container Ich gehe davon aus.

Hier ist die Fehlermeldung:

  

Fehler 1 Fehler LNK2005: „public:   __thiscall std :: list

     
    

:: list> (void)“     (?? 0? $ List @ VCRect @@ V? $ Allocator @ VCRect @@@ std @@@ std @@ QAE @ XZ)     bereits definiert in     SomeLowLevelLibrary.lib

  

Die geringe Bibliothek, die in der Fehlermeldung verwiesen hat keine Ahnung über das Projekt hat ich bin Gebäude, es hat nur geringe Funktionalität Kern und befasst sich nicht mit hohen MFC GUIs.

Ich kann die Linker-Fehler erhalten gehen weg, wenn ich die Zeile Code zu ändern:

std::list<CRect*> myVar;

Aber ich will nicht, dass es im Interesse der es hacken.

Auch spielt es keine Rolle, ob ich die Variable auf dem Stack oder dem Heap erstellen, ich immer noch die gleichen Fehler.

Hat jemand irgendwelche Ideen überhaupt darüber? Ich bin mit Microsoft Visual Studio 2008 SP1 auf Vista Enterprise.

Edit:. Der Linker Fehler, der oben für die std :: Liste ist <> Konstruktor, habe ich auch einen Fehler für den destructor, _Nextnode und klare Funktionen erhalten

Edit: In anderen Dateien im Projekt, std :: vector nicht verknüpfen, in anderen Dateien könnte es std :: list. Ich kann nicht arbeiten, warum einige Container arbeiten, und manche nicht. MFC Verknüpfung ist über beiden Bibliotheken statisch. In der Low Level-Bibliothek haben wir 1 Klasse, die von std :: Liste erbt.

Edit:. Die geringe Bibliothek hat keine Klassen, die von CRect erben, aber es macht Verwendung von STL machen

War es hilfreich?

Lösung 2

Ich stolperte vor kurzem über diesen Fehler wieder in unser Projekt und entschied sich für eine gründlichere Untersuchung nur im Vergleich zu haben es mit einem Hack wie beim letzten Mal (Swap std :: list für CArray) Patchen. Es stellt sich heraus, dass einer unserer Low-Pegel-Bibliotheken wurde aus std :: vererben Liste, z.

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

Dies ist nicht nur eine schlechte Praxis, aber es war auch die Ursache für die Linkerfehler in der Hauptanwendung. Ich CRectList ändern std :: Liste zu wickeln, anstatt von ihm zu erben, und der Fehler ging weg.

Andere Tipps

Sie sollten an den Linker-Einstellungen suchen, aber ich kann nicht sofort sagen, welche. Es ist normal für STL instantiations in mehreren Dateien durchgeführt werden. Der Linker sollte man wählen. Sie sind alle gleich (vorausgesetzt, Sie tun haben konsistente Compiler-Einstellungen).

Das klingt nicht wie das genaue Symptom, aber um sicher zu sein, sollten Sie prüfen, ob Ihr Hauptprojekt und alle eingebundenen Bibliotheken die gleiche „Runtime Library“ verwenden Einstellung unter „C ++: Code Generation“. diese Einstellungen Mischen kann Laufzeitbibliothek Verbindungsfehler erstellen. (Was in Ihrem Fall verwirrt mich ist, dass man es weg, indem Sie den Code zu ändern, aber es ist die Überprüfung wert, wenn Sie nicht bereits haben.)

Hat SomeLowLevelLibrary.lib enthalten oder alle Klassen verwenden namens CRect? Ist es STL verwenden?

Ist die Datei in einem Header enthalten, die in zwei separaten Code-Modulen zusammengestellt werden könnten?

Eine andere Möglichkeit zufällig tauchte in meinem Kopf heute. Ist es möglich, dass Ihre aktuelle DLL und Low-Level-Bibliothek verweisen zwei verschiedene Versionen von MFC? Langer Schuss.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top