2 Stimmen

Wie behebt man diesen VC++ 6.0 Linker-Fehler?

Es handelt sich um eine Windows-Konsolenanwendung (eigentlich ein Dienst), die ein Vorgänger vor 4 Jahren erstellt hat und die installiert ist und läuft. Ich muss nun einige Änderungen vornehmen, kann aber nicht einmal die aktuelle Version erstellen! Hier ist die Build-Ausgabe:

--------------------Configuration: MyApp - Win32 Debug--------------------
Compiling resources...
Compiling...
Main.cpp
winsock.cpp
Linking...
LINK : warning LNK4098: defaultlib "LIBCMTD" conflicts with use of other libs; use /NODEFAULTLIB:library
Main.obj : error LNK2001: unresolved external symbol _socket_dontblock
Debug/MyApp.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

MyApp.exe - 2 error(s), 1 warning(s)
--------------------------------------------------------------------------

Wenn ich die /NODEFAULTLIB dann bekomme ich eine Menge Fehler. Der Code verwendet eigentlich nicht _socket_noblock aber ich kann im Internet nichts darüber finden. Vermutlich wird es von einer Bibliothek verwendet, auf die ich verweise, aber ich weiß nicht, in welcher Bibliothek es sich befindet.

--- Alistair.

3voto

atzz Punkte 16542

LNK4098 ist möglicherweise kein Problem. Es kann zum Beispiel auftreten, wenn Sie gegen eine Release-Version einer Bibliothek linken, die statische Laufzeitverknüpfung verwendet und bewirkt, dass LIBCMT (beachten Sie das Fehlen des Suffix "D") zu den Standardbibliotheken hinzugefügt wird. Ihre Anwendung, die in der Debug-Konfiguration erstellt wurde, verwendet LIBCMT D daher der Konflikt. Es kann eigentlich sicher sein, vorausgesetzt, dass Sie nichts Laufzeit-abhängiges mit dieser Bibliothek austauschen.

In Bezug auf _socket_noblock können Sie ein Suchprogramm (z. B. grep oder find) verwenden, um nach dieser Zeichenfolge in .obj- und .lib-Dateien zu suchen. Auf diese Weise wissen Sie, welche Bibliothek das Symbol referenziert, was ein Ansatzpunkt sein kann, um herauszufinden, welche Abhängigkeiten diese Bibliothek hat.

1voto

Joris Timmermans Punkte 10536

Sie können verwenden "Dependency Walker" - ein kostenloses Tool, um die Abhängigkeiten Ihrer Anwendung zu finden, um herauszufinden, wie Ihre Anwendung mit libcmtd verknüpft ist. Editar: Sie können das natürlich nicht für die neue Version verwenden, bei der die Verknüpfung fehlschlägt (siehe Kommentare), aber Sie können es für die alte Version oder für bekannte Bibliotheken verwenden, mit denen die neue Version verknüpft ist.

Da das eigentliche Problem jedoch nichts mit meinem Vorschlag zu tun hatte, sollte die Frage vielleicht geschlossen werden.

Es sieht so aus, als ob Sie mit verschiedenen Versionen des CRT verlinken - möglicherweise, weil Sie alte Bibliotheken zusammen mit einem neuen Compiler und einer neuen Version des CRT verwenden.

1voto

user41013 Punkte 1199

Leider hat sich herausgestellt, dass es sich um ein internes Problem handelt. Eine Kombination aus einem maverick coder vor 4 Jahren und einem rostigen Nichts (ich!) jetzt.

Der Code verwendet nicht _socket_noblock aber es hace utilice socket_noblock und ich muss nur einen Link zu einer unserer eigenen Bibliotheken herstellen.

0voto

EvilTeach Punkte 27313

Standardlib "LIBCMTD" steht im Konflikt mit der Verwendung anderer Libs ist eine Warnung, die anzeigt, dass Ihr Programm eine andere Version der Laufzeitbibliothek verwendet als eine oder mehrere Ihrer Bibliotheken. Verwenden Sie für das Programm und die Bibliotheken dieselbe Laufzeitbibliothek, um die Warnung zu beseitigen.

(Projekteinstellungen) (Registerkarte C++) Kategorie (Code-Generierung) (Laufzeitbibliothek verwenden)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X