9 Stimmen

Warum kann ein "Prozedureinstiegspunkt konnte nicht in der dll gefunden werden" nicht angezeigt werden, wenn ich ihn definitiv eingefügt habe?

Ich habe ein sehr vages Problem, aber ich hoffe, jemand kann mir helfen. Ich habe ein C++ Projekt geändert und gestern hat es noch funktioniert, aber heute nicht mehr. Ich bin mir ziemlich sicher, dass ich nichts geändert habe, aber um ganz sicher zu gehen, habe ich das Projekt noch einmal aus dem SVN ausgecheckt und sogar einen früheren Systemwiederherstellungspunkt wiederhergestellt (da dies ein Arbeitscomputer ist, werden manchmal heimlich Updates installiert usw.). Nachdem ich es erfolgreich kompiliert habe, kann das Programm starten, aber nachdem ich mit ihm interagiert habe, erhalte ich diesen Fehler: Der Prozedureinstiegspunkt ?methodName@className@@UAEXXZ konnte nicht in der dynamischen Link-Bibliothek libName.dll gefunden werden.

Ich habe das Internet durchsucht, aber die meisten Probleme scheinen auf eine ältere Version der verwendeten DLL zurückzuführen zu sein. Ich habe meinen Computer durchsucht, und es gibt keine ältere Version. Wenn ich die richtige Version lösche, lässt sich die Anwendung nicht starten. Wenn ich dann das Projekt neu kompiliere, wird die DLL wieder erstellt, so dass ich mir ziemlich sicher bin, dass die Anwendung die richtige DLL verwendet und dass die Kompilierung sie erstellt. Wenn ich in die Methode, auf die sich der Fehler bezieht, Syntaxfehler einfüge, weigert sich das Projekt zu kompilieren, was wohl bedeutet, dass es auch die Dateien kompiliert, die die Methode enthalten.

Grundsätzlich weiß ich nichts über DLLs, Verknüpfung, etc., so würde ich es sehr zu schätzen wissen, wenn jemand eine Idee, warum die Funktionen, die sehr klar in das Projekt definiert sind, sind ganz plötzlich nicht machen es in die DLL mehr hat. Ich weiß, dass dies vage ist, und wenn weitere Informationen erforderlich sind, werde ich sie gerne zur Verfügung stellen. Vielen Dank!

Aktualisierung: Ich habe die angegebenen Vorschläge ausprobiert, aber ich komme immer noch nicht weiter. __declspec(dllexport) wird offenbar nicht im gesamten Projekt verwendet. Wenn ich die DLL mit Dependency Walker öffne, sehe ich oben rechts einen leeren Abschnitt und der Abschnitt darunter listet die Funktion aus der Fehlermeldung auf. Wenn ich die C++-Funktionen entdekorieren sieht es gut aus, aber wenn ich es nicht tue, erhalte ich die seltsamen Fragezeichen und @s aus der Fehlermeldung und es scheint einen Unterschied am Ende zu geben:

?methodName@className@@UAEXXZ
?methodName@className@@UAEXH@Z

Vielleicht ist das das Problem, aber ich habe keine Ahnung, was es bedeutet, was die Ursache dafür sein könnte und was ich dagegen tun kann.

9voto

Mark Rushakoff Punkte 236626

Verwenden Sie tatsächlich __declspec(dllexport) ? Meine Vermutung ist nein - ohne diese Deklaration wird die Funktion nicht von der DLL exportiert (oder mit anderen Worten, Programme, die diese DLL laden, haben keinen Zugriff auf Funktionen ohne diese Deklaration).

Versuchen Sie auch, mit Abhängigkeits-Walker um genau zu sehen, welche Funktionen Ihre DLL zur Verfügung gestellt hat.


Die Tatsache, dass __declspec(dllexport) nicht in Funktionsdeklarationen verwendet wird, ist in Ordnung - in den meisten Fällen wird es nur einmal in einer einzigen Header-Datei verwendet werden, wie

#ifdef MAKING_DLL
#define FOO_API __declspec(dllexport)
#else
#define FOO_API
#endif

Wenn Sie also #define MAKING_DLL vor diesem Abschnitt werden alle Funktionen, die wie FOO_API int BakeACake() exportiert werden, je nachdem, ob MAKING_DLL definiert wurde. Es ist möglich, dass das Projekt erwartete MAKING_DLL (oder dessen Äquivalent) auf der Befehlszeile definiert werden, je nach dem erstellten Projekttyp (etwas wie /DMAKING_DLL ; oder Sie müssen FOO_API vielleicht sogar selbst definieren wie /DFOO_API=__declspec(dllexport) .

Der leere Abschnitt oben rechts im Dependency Walker bedeutet nur, dass Ihr Programm nicht mit der entsprechenden .lib-Datei der DLL verknüpft ist. Das ist in Ordnung, es bedeutet nur, dass Sie mit LoadLibrary o LoadLibraryEx um auf Funktionen in der DLL zuzugreifen.

Ein anderes wahrscheinliches Szenario (basierend auf der Tatsache, dass die Namen unterschiedlich sind) ist, dass das Programm mit einer anderen Version von Visual Studio als 2008 erstellt wurde, die Sie zum Erstellen der DLL verwendet haben. Im Gegensatz zu einfachem C gibt es keine Standard-Binärschnittstelle für C++, was bedeutet, dass Sie denselben Compiler zum Erstellen des Programms und der DLL verwenden müssen, wenn Sie C++-Klassen in der DLL verwenden. Wenn Sie können, versuchen Sie, das Programm in VS2008 neu zu erstellen, oder versuchen Sie, die DLL in der gleichen Version von VS neu zu erstellen, in der das Programm erstellt wurde.

2voto

Ponting Punkte 906

Herunterladen Gehhilfe für Abhängige und öffnen Sie Ihre DLL mit diesem Tool. Es wird eine Liste der exportierten Funktionen Ihrer DLL angezeigt. Prüfen Sie, ob die oben genannte Methode Teil der erwarteten Funktionen ist. Wenn nicht, dann haben Sie versehentlich folgende Funktionen entfernt __declspec(dllexport) für eine der Klassen in dieser DLL.

1voto

Jordi Punkte 5718

Ich komme mir ein bisschen blöd vor, aber ich habe die Antwort gefunden. Die von mir verwendete Anwendung (Exe) lud offenbar eine zweite, andere DLL, die von der in meinem ursprünglichen Beitrag erwähnten abhängig war. Diese zweite DLL erwartete immer noch die alten Funktionen und musste ebenfalls mit der aktualisierten DLL neu kompiliert werden.

Vielen Dank an die Leute, die versucht haben, mir hier zu helfen!

0voto

Povilas Punkte 1

Anhand der Informationen in den obigen Beiträgen habe ich eine einfache allgemeine Lösung gefunden. Alles, was Sie tun müssen, ist öffnen Programme ausführbare mit Abhängigkeit Walker, suchen Sie nach den fehlenden Funktionen, schauen Sie, welche dll's es verwenden, finden Sie das Projekt, das diese dll baut und neu erstellen es.

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