2009-06-24 2 views
6

Ich bin gettings diese Art von Fehlern in einem MFC VS6 Projekt zu vermeiden, während die Anwendung verbinden:wie „bereits definierten Fehler“ in C++

msvcrt.lib(MSVCRT.dll) : error LNK2005: _atoi already defined in LIBC.lib(atox.obj) 

Ich weiß, was es bedeutet (eine Funktion in zwei verschiedenen Bibliotheken vorhanden); um es zu lösen, müsste ich eine der 2 Bibliotheken ausschließen (msvcrt.lib oder libc.lib).

Aber wenn ich dies tue, gibt es alle Arten von ungelösten externen Fehlern. Also würde ich gerne beide Bibliotheken verwenden.

Gibt es eine Möglichkeit, den Linker zu sagen, dass ich die _atoi Funktion in libc.lib und nicht in msvcrt.lib (oder umgekehrt) verwendet werden soll?

Jede Hilfe oder Richtung wäre toll.

Antwort

1

Es scheint eine Option zu geben, mit der Sie solche Fehler ignorieren können: in projectsettings> link> check 'Force file output'. Dies wird das Programm generieren, selbst wenn Linkfehler vorhanden sind.

Die Build-Ausgabe gibt so etwas wie dieses:

msvcrt.lib (MSVCRT.dll): Warnung LNK4006: _atoi bereits in LIBC.lib (atox.obj) definiert sind; zweite Definition ignoriert

Natürlich müssen Sie diese Option mit Vorsicht verwenden, da sie eine Anwendung generieren kann, die in einigen Fällen nicht funktioniert, aber hier tut es wahrscheinlich keinen Schaden (ich hoffe).

Vielen Dank für die anderen Antworten, aber das schien in meinem speziellen Fall keine Option zu sein.

11

Dieser Fehler bedeutet sicher, dass Sie zwei Teile von Codes verknüpfen, die mit verschiedenen Laufzeitbibliotheken kompiliert wurden. MSVCRT.dll ist die dynamische Version, während LIBC.lib die statische Version ist. Wenn du das tust, brich die Hölle los. Versuchen Sie herauszufinden, welche Teile Ihres Codes welche Version verwenden, und sortieren Sie diese aus.

+1

Gerade hatte ein ähnliches Problem, wie ich mit dem nicht verwalteten Welt nicht viel vertraut bin es ein bisschen eine Überraschung für mich war, dass man verschiedene Versionen einer 3rd-Party-Bibliothek benötigt je nachdem, welche Laufzeit der Code-Bibliotheken und die Bibliothek benutzen. Ich habe einen 3rd-Party-lib und versuchte es mit einem Projekt in VC zu verknüpfen ++ 2005 die Bibliothek stellte mir heraus, verwendet und ältere Version des (a?) Laufzeitbibliothek - LIBCP.lib. Glücklicherweise war die Quelle der 3rd-Party-Bibliothek verfügbar, so dass ich sie mit der VC2005-Laufzeitbibliothek ergänzen konnte. Ich frage mich, wie ich das ohne die Quelle lösen würde. – axk

4

Sie haben einen Laufzeitkonflikt. Die Verwendung mehrerer Laufzeitbibliotheken ist im Allgemeinen eine schlechte Sache.

Sie können/nodefaultlib: msvcrt (oder/nodefaultlib: libc) in Ihren Linker-Optionen verwenden, um das eine oder das andere auszuschließen.

Bevor Sie darauf zurückgreifen, überprüfen Sie Ihre Projekteinstellungen. Wenn ich mich richtig erinnere, ist libc die Single-Thread-Laufzeit in VS6 und msvcrt ist die Multi-Thread-Laufzeit. Wenn Sie mehrere Projekte in Ihrer Lösung haben, stellen Sie sicher, dass sie alle das eine oder das andere verwenden.

+1

libc ist single-threaded statisch. libcmt ist multi-threaded statisch. msvcrt ist eine DLL und multi-threaded. libc ist in aktuellen MSVC-Versionen nicht mehr verfügbar. – MSalters