Frage

Beim Erstellen von Projekten in C++ habe ich das Debuggen von Verknüpfungsfehlern als schwierig empfunden, insbesondere wenn ich den Code anderer Leute übernommen habe.Welche Strategien verwenden Benutzer zum Debuggen und Beheben von Verknüpfungsfehlern?

War es hilfreich?

Lösung

Ich bin mir nicht sicher, wie hoch Ihr Fachwissen ist, aber hier sind die Grundlagen.

Unten ist ein Linker-Fehler von VS 2005 – ja, es ist ein riesiges Durcheinander, wenn Sie damit nicht vertraut sind.

ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" (?does_not_exist@@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" (?TextScan@@YAXAAUFileTextStats@@PBD1_N2_J@Z)

Es gibt ein paar Punkte, auf die man sich konzentrieren sollte:

  • „ByteComparator.obj“ – Suchen Sie nach einer ByteComparator.cpp-Datei. Dies ist die Ursache des Linker-Problems
  • „int __cdecl does_not_exist(void)“ – Dies ist das Symbol, das nicht gefunden werden konnte, in diesem Fall eine Funktion namens does_not_exist()

An diesem Punkt besteht in vielen Fällen der schnellste Weg zur Lösung darin, die Codebasis nach dieser Funktion zu durchsuchen und herauszufinden, wo sich die Implementierung befindet.Sobald Sie wissen, wo die Funktion implementiert ist, müssen Sie nur noch sicherstellen, dass die beiden Orte miteinander verknüpft werden.

Wenn Sie VS2005 verwenden, verwenden Sie das Kontextmenü „Projektabhängigkeiten ...“.Wenn Sie gcc verwenden, suchen Sie in Ihren Makefiles nach dem Schritt zur Generierung der ausführbaren Datei (gcc wird mit einer Reihe von .o-Dateien aufgerufen) und fügen Sie die fehlende .o-Datei hinzu.


In einem zweiten Szenario fehlt Ihnen möglicherweise eine „externe“ Abhängigkeit, für die Sie keinen Code haben.Die Win32-Bibliotheken werden häufig in statischen Bibliotheken implementiert, zu denen Sie eine Verknüpfung herstellen müssen.Gehen Sie in diesem Fall zu MSDN oder „Microsoft Google“ und suchen Sie nach der API.Am Ende der API-Beschreibung wird der Bibliotheksname angegeben.Fügen Sie dies Ihrer Projekteigenschaftenliste „Konfigurationseigenschaften->Linker->Eingabe->Zusätzliche Abhängigkeiten“ hinzu.Zum Beispiel die Funktion timeGetTime()'s Seite auf MSDN fordert Sie unten auf der Seite auf, Winmm.lib zu verwenden.

Andere Tipps

Die C-Laufzeitbibliotheken sind oft der größte Übeltäter.Stellen Sie sicher, dass alle Ihre Projekte die gleichen Einstellungen für Single-Threading vs. Multi-Threading und statisch vs. DLL haben.

Die MSDN-Dokumentation ist gut geeignet, um darauf hinzuweisen, welche Bibliothek ein bestimmter Win32-API-Aufruf benötigt, wenn er fehlt.

Ansonsten kommt es in der Regel darauf an, die Verbose-Flagge zu aktivieren und die Ausgabe auf der Suche nach Hinweisen durchzuwühlen.

Einer der häufigsten Verknüpfungsfehler, auf die ich gestoßen bin, besteht darin, dass eine Funktion anders verwendet wird als sie definiert ist.Wenn Sie einen solchen Fehler sehen, sollten Sie sicherstellen, dass jede von Ihnen verwendete Funktion in einer .h-Datei ordnungsgemäß deklariert ist.
Sie sollten außerdem sicherstellen, dass alle relevanten Quelldateien in derselben lib-Datei kompiliert werden.Ein Fehler, auf den ich gestoßen bin, ist, wenn ich zwei Dateisätze in zwei separate Bibliotheken kompiliert habe und zwischen Bibliotheken einen gegenseitigen Aufruf durchführe.

Gibt es einen Misserfolg, den Sie im Sinn haben?

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