Kurz gesagt: auf Visual C++ 2015 bekomme ich einen Linker-Fehler über das Fehlen von Symbolen, die in der .lib-Datei, gegen die ich verlinke.Visual C++ - Linker beschwert sich über das Fehlen eines Symbols, das nicht abwesend ist
In lange: Während einige Programm von der Kommandozeile mit cl.exe Kompilieren-und-Vorliebe ich folgendes als erste von vielen Fehlern erhalten:
main.obj : error LNK2001: unresolved external symbol "protected: static struct wxEventTable const wxApp::sm_eventTable" ([email protected]@@[email protected]@B)
AFAIK, diese lange Schlange sagt dass meine main.obj sich auf eine Funktion bezieht, der ein Symbol? sm_eventTable @ wxApp @@ 1UwxEventTable @@ B zugeordnet ist, aber dass der Linker dieses Symbol nicht in der (langen) Liste der Bibliotheken finden konnte, die ich in der Befehlszeile angegeben habe .
Ich kompiliere in/MD-Modus. Ich weiß nicht, ob es hilft, tut weh oder hat hier keine Bedeutung.
Eine der Dateien mit I-Link ist wxmsw31u_core.lib und tun
dumpbin/headers wxmsw31u_core.lib> here.txt
eine lange Datei gibt containting die folgende
Version : 0
Machine : 8664 (x64)
TimeDateStamp: 56D46194 Mon Feb 29 16:19:48 2016
SizeOfData : 00000045
DLL name : wxmsw310u_core_vc140_x64.dll
Symbol name : [email protected]@@[email protected]@B (protected: static struct wxEventTable const wxApp::sm_eventTable)
Type : data
Name type : name
Hint : 14083
Name : [email protected]@@[email protected]@B
Aus Daraus schließe ich, dass wxmsw31u_core.lib eine "Import-Bibliothek" ist: Mit anderen Worten, das bedeutet, dass diese Bibliothek nicht den Code enthält, sondern nur auf die DLL-Datei wxmsw310u_core_vc140_x64.dll verweist, die den Code enthält. ?
Letztere wxmsw310u_core_vc140_x64.dll Datei in der Tat erwähnt sm_eventTable @ wxApp @@ 1UwxEventTable @@ B, wie ich überprüft:
dumpbin/exports wxmsw310u_core_vc140_x64.dll> here2.txt
gab
14084 3703 0057F008 [email protected]@@[email protected]@B = [email protected]@@[email protected]@B (protected: static struct wxEventTable const wxApp::sm_eventTable)
Ich bemerke, dass die erste Zahl gleich dem Hinweis der vorherigen Kopfzeile plus eins ist. Ich nehme an, das ist normal?
Ich nahm mir die Zeit, um die DLL wie oben zu überprüfen, aber AFAIK, die DLL ist nicht in der Verknüpfung erforderlich (es ist erforderlich, wenn Sie die .exe, die produziert wird) aufrufen.
Alles in allem scheint es, dass alles da ist und es sollte verlinken, also bin ich ratlos, um festzustellen, was hier falsch ist.
bearbeiten
Ich löste teilweise das Problem, indem ich die Libary Kompilieren statt mit dem kompilierten binaires für Windows von wxWidgets zur Verfügung gestellt: Ich kann jetzt mein Programm kompilieren und alles ist gut.
Nun, nicht alle: die erste Frage bleibt. Ich hatte eine Situation, wo ich versuchte, ein Obj mit einer Lib zu verknüpfen, um eine exe zu erhalten, der Obj verweist auf ein Symbol, dessen Name in der lib wörtlich vorhanden ist, der Linker lädt obj und lib (bestätigt mit/VERBOSE), Der Linker weigert sich jedoch, das Symbol als "aufgelöst" zu betrachten. Warum?
Ich werde eine neue Frage erstellen, wo ich nach Erklärungen zu den zu lösenden Bedingungen frage.
Vielen Dank für Ihre Antwort. Meine Befehlszeile hat tatsächlich/MACHINE: X64 und/LIBPATH: "the-path-to-the-lib" (jedenfalls ohne die lib stoppt der Linker in einem früheren Schritt). – Arnaud
@Arnaud '/ LIBPATH' sollte der Pfad zum Verzeichnis sein, nicht zur Bibliotheksdatei selbst. – Nikita
Ja, das ist der korrekte Pfad – Arnaud