Frage

Ich habe einen alten Arbeitsbereich geöffnet, bei dem es sich um eine Bibliothek und deren Testumgebung handelt.Früher hat es gut funktioniert, aber jetzt funktioniert es nicht mehr und ältere Versionen des Codes funktionieren auch nicht mit den gleichen Fehlern.Ich habe versucht, das Projekt neu zu erstellen, aber auch das verursacht die gleichen Fehler.In den Projekteinstellungen scheint nichts in Ordnung zu sein und der generierte Code funktioniert in der Haupt-App.

Ich habe die meisten Dateien entfernt und auf das Nötigste reduziert, um den Fehler zu erzeugen.Leider kann ich das Projekt nicht veröffentlichen, da es im Produktionscode verwendet wird.

Der LNK2001-Linkerfehler, den ich erhalte, bedeutet normalerweise, dass ich eine Bibliothek weggelassen oder vergessen habe, eine virtuelle Funktion zu implementieren.Dies ist jedoch Teil der Standard-Vorlagenbibliothek – und noch dazu ein Header.

Der Code, bei dem in IOCompletionPort.obj das Problem auftritt, wird tatsächlich nicht verwendet std::string direkt, ruft aber eine Klasse auf, die Folgendes tut: Comms::Exception akzeptiert a std::string und der Wert von GetLastError oder WSAGetLastError.

Die im Fehler erwähnte Funktion (GetMessage) ist implementiert, aber eine virtuelle Funktion, sodass andere Klassen sie bei Bedarf überschreiben können.Es scheint jedoch, dass der Compiler es als Ansi-Version erstellt hat, aber ich kann in den Einstellungen keine Optionen finden, die das steuern würden.Ich vermute, dass das das Problem sein könnte, aber da es nur sehr wenige Optionen für die Bibliothek gibt, kann ich es nicht genau wissen.Allerdings geben beide Projekte _MBCS in den Compiler-Optionen an.

--------------------Aufbau:TestComms - Win32 Debug------ Verlinkung...Comms.lib (iocompletionport.obj):Fehler LNK2001:ungelöstes externes Symbol „öffentlich:Virtuelle Klasse Std :: Basic_String, Klasse std :: allocator> __thiscall comms :: exception :: getMessagea (void) const "(? @@ v? $ Allocator@d@2 @@ std @@ xz) debug/testcomms.exe:Schwerwiegender Fehler LNK1120:1 ungelöster externer Fehler ausführen link.exe.

TestComms.exe – 2 Fehler, 0 Warnung(en)

Irgendwelche Vorschläge?Ich habe dadurch den größten Teil des Vormittags verloren und möchte nicht auch den größten Teil des Nachmittags verlieren.

War es hilfreich?

Lösung

Eine Möglichkeit liegt in der „Namensverfälschung“ von Win32 ANSI/Unicode, die das Symbol umwandelt GetMessage in beides GetMessageA oder GetMessageW.Es gibt drei Möglichkeiten:

  1. Windows.h wurde also nicht geladen GetMessage bleibt GetMessage

  2. Windows.h wurde mit Symbolen geladen, die für ANSI festgelegt waren GetMessage wird GetMessageA

  3. Windows.h wurde mit für Unicode festgelegten Symbolen geladen GetMessage wird GetMessageW

Wenn Sie zwei unterschiedliche Dateien auf eine Weise kompiliert haben, die zwei unterschiedliche Szenarien auslöst, erhalten Sie einen Linker-Fehler.Die Fehlermeldung weist darauf hin, dass die Comms::Exception Die Klasse war eine Instanz von #2 oben – vielleicht wird sie irgendwo verwendet, wo Windows.h nicht geladen wurde?

Andere Dinge, die ich an Ihrer Stelle tun würde, nur aus Routinegründen:

1) Stellen Sie sicher, dass meine Include- und Bibliothekspfade nichts enthalten, was ich nicht erwarte.

2) Führen Sie einen „Build Clean“ durch und überprüfen Sie ihn dann manuell. Löschen Sie bei Bedarf alle zusätzlichen Objektdateien.

3) Stellen Sie sicher, dass es in Include-Anweisungen keine fest codierten Pfade gibt, die nicht die Bedeutung haben, die sie hatten, als das Projekt ursprünglich neu erstellt wurde.

BEARBEITEN:Ich kämpfe mit der Formatierung :(

Andere Tipps

@Curt:Ich glaube, du kamst dem am nächsten.Ich habe das nicht getestet, aber ich glaube, ich habe in meiner ursprünglichen Frage irgendwie die Antwort gegeben.

GetMessage ist eine Definition in Windows.h, die in einen ifndef-Block eingeschlossen ist, um zwischen Ansi (GetMessageA) und Unicode (GetMessageW) zu wechseln.

Vorausgesetzt, Sie haben nicht mit den Projekteinstellungen herumgespielt und etwas gelöscht, was Sie nicht haben sollten (wo ich externe Abhängigkeiten wie User32.lib erwarten würde):

Tools überprüfen | Optionen | Verzeichnisse | Bibliotheken (hier aus dem Gedächtnis gehen) und stellen Sie sicher, dass Ihnen die Verzeichnisse der Common-Gärten-Sorte Lib nicht vermissen (wieder ohne VC6 vor mir, kann ich Ihnen nicht sagen, was sie sind)

Dies ist ein allgemeines Problem bei der Art und Weise, wie Microsoft mit ANSI vs.Unicode-APIs.Da sie alle (oder fast alle) durch die Definition von Makros für die Funktionsnamen erledigt werden, die in die „A“- oder „W“-Versionen der Funktionsnamen aufgelöst werden, können Sie in Ihrem Namespace/Ihrer Klasse/Struktur/Enum/nicht sicher einen Bezeichner haben. Funktion, die einem Windows-API-Namen entspricht.

Die Windows.h-Makros laufen rücksichtslos über alle anderen Namespaces.

windows.h wird oben in IOCompletionPort.h als Include deklariert. Ich hatte es satt, 7 Zeilen zu sehen, nur um eine Datei einzuschließen, also habe ich es in eine eigene Datei verpackt und diese selbst eingebunden.Dies enthält auch einige zusätzliche #defines (z. B. ULONG_PTR), da unsere Haupt-App mit installiertem Platform SDK nicht kompiliert werden kann:-(

  1. Das ist bestätigt.Nichts ist fehl am Platz.
  2. Das habe ich getan – die Build-Verzeichnisse gelöscht
  3. Ich verwende niemals fest codierte Pfade.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top