2011-01-08 8 views
3

Ich habe andere Beispiele von Menschen mit diesem Problem gefunden, aber hatten kein Glück mit ihren Lösungen. Ich versuche, std :: cout in einer statischen Bibliothek zu verwenden, die auch Boost-Threads und Bind verwendet. Wenn ich nicht benutze und std::cout kompiliert und Links gut mit dem Hauptprogramm, aber wenn ich und ich die Bibliothek kompilieren habe ich keine Probleme, aber wenn ich kompilieren und verknüpfen das Hauptprogramm, das die statische Bibliothek verwendet, bekomme ich eine Menge Dinge wie:MSVC 2010 Linker Fehler 2005 mit Std :: Cout in der statischen Bibliothek

 
2>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in MSVCRTD.lib(cinitexe.obj) 
2>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in MSVCRTD.lib(cinitexe.obj) 
2>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in MSVCRTD.lib(cinitexe.obj) 
2>LIBCMT.lib(mlock.obj) : error LNK2005: __unlock already defined in MSVCRTD.lib(MSVCR100D.dll) 
2>LIBCMT.lib(mlock.obj) : error LNK2005: __lock already defined in MSVCRTD.lib(MSVCR100D.dll) 
2>LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in MSVCRTD.lib(MSVCR100D.dll) 
2>LIBCMT.lib(crt0.obj) : error LNK2005: _mainCRTStartup already defined in MSVCRTD.lib(crtexe.obj) 

etc ...

ich in meiner Linker-Einstellungen versucht haben, zu gehen und es verwenden, die in Konflikt stehende Bibliothek in der Fehlerausgabe aufgelistet stoppen, aber ich kann es nicht richtig machen. Wenn ich sage, dass ich aufhören soll, eine Bibliothek zu benutzen, kann es die Probleme beheben, aber ein paar fehlende externe Symbole geben, dann wechsle ich die Bibliothek, mit der es Probleme gab, aber ich bekomme noch ein paar "bereits definiert". Irgendwelche Hinweise darauf, was ich tun kann, um das zu beheben? Sollte ich nur eine andere Klasse namens "log" oder etwas machen und einfach von der Haupt-EXE-Datei darauf zugreifen (was würde die Zeichenketten-Bibliothek verwenden, was wiederum Probleme verursachen könnte, aber ich habe es noch nicht versucht)? Danke für jede Hilfe.

+0

Was versuchst du sowieso? – chrisaycock

+0

Ich möchte nur meinen neuen Thread mit boost erstellt werden, wo es für den Fortschritt beim Erstellen einer GUI ist und es als eine einfache Möglichkeit des Debuggens und Probleme verwenden, wenn ich sie habe. – contrapsych

+0

Können Sie Ihre Frage bearbeiten, um Ihre 'cout'-Anweisung aufzulisten? – chrisaycock

Antwort

9

Versuchen Sie zu prüfen -> Projekt + Eigenschaften, C/C++, Code-Generierung, Runtime-Bibliothek. Ihre .lib und Ihr Hauptprojekt müssen hier die gleiche Einstellung verwenden.

+0

ES FUNKTIONIERT !! Danke, einer war Debugger und der andere war nicht. – contrapsych

3

Klicken Sie mit der rechten Maustaste auf Ihr Projekt, Eigenschaften, C/C++, Codegenerierung, Laufzeitbibliothekseinstellung. Das ist die Ursache Ihres Problems. Einstellungen dort sind/MT und/MD. Sie verknüpfen Code mit widersprüchlichen Werten für diese Einstellung, alles muss mit demselben kompiliert werden.

Boost könnte der eine sein. Überprüfen Sie die Einstellung Zusätzliche Abhängigkeiten Ihres Linkers. IIRC, die .libs haben mt oder md in ihrem Namen.

2

LNK2005 tritt auf, wenn zwei Kompilierungsobjekte die gleichen Symbole enthalten. Wenn Sie versuchen, sie miteinander zu verbinden, weiß der Linker nicht, was er tun soll, weil er von allem Duplikate hat, daher der Fehler.

Insbesondere klingt es wie Ihre statische lib/Vielleicht Boost möglicherweise mit /MT kompiliert wurde, die die MSVC-Laufzeit in statisch verbindet. Es sieht so aus, als ob Sie versuchen, Ihren Code mit den Standardoptionen zu kompilieren (/MD, eine dynamische Verknüpfung zu MSVCR100.DLL, MSVCP100.DLL).

Siehe http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx

Sie entweder wieder aufgebaut kann die statische Bibliothek gewährleistet es gegen die dynamischen Bibliotheken verknüpft ist, oder versuchen statisch Code verknüpft.

Ich sollte hinzufügen, dass die am Ende nur Debug bedeutet. d.h. MSVCP100D.DLL ist die Debug-Version von MSVCP100.DLL.