c++ - übergeben - Funktionsaufruf springt auf die falsche Funktion




c++ pointer übergeben (4)

Dies ist höchstwahrscheinlich auf inkompatible Aufrufkonventionen zurückzuführen, bei denen die Bibliothek und der Aufrufer unterschiedliche Vorstellungen über das Stapellayout haben.

Weitere Informationen finden Sie in MSDN .

Ich kompiliere eine C ++ statische Bibliothek in vs2008, und in der Lösung habe ich auch ein Startprojekt, das die lib verwendet, und das funktioniert gut.

Aber wenn ich die lib in einer anderen Lösung verwende, bekomme ich einen Fehler bei der Laufzeitprüfung. "Der Wert von ESP wurde nicht korrekt über einen Funktionsaufruf gespeichert." Beim Durchschreiten des Codes bemerkte ich eine Funktion foo (), die direkt vor dem Absturz zu bar () springt. Die fraglichen Funktionen sind nur normale Funktionen und keine Funktionszeiger.

Jeder hat eine Ahnung, was passieren könnte, und warum es funktioniert, wenn die libs von der gleichen Lösung verwendet werden?

edit: Die Funktionen (Methoden) sind Teil einer Klasse, wenn das hilft.


Ich erinnere mich daran, solche Dinge zu sehen, wenn die Strukturelementausrichtung (/ Zp-Compiler-Schalter) der Binärdateien unterschiedlich war. Das könntest du auch überprüfen.

Die Einstellung über das Paket #pragma statt über die Projekteinstellungen sollte sicherer sein.


Verzeihen Sie mir, dass die Blutung hier offensichtlich ist, aber ... Ich habe gesehen, dass so etwas schon oft passiert ist, wenn Objektdateien (.o) und Headerdateien (.h) nicht mehr synchron sind. Vor allem in Bezug auf virtuelle Methoden.

Bedenken Sie: Die Objektdatei wird mit Header kompiliert:

class Foo { virtual void f(); };

Aber dann wird der Header geändert zu:

class Foo { virtual void g(); virtual void f(); };

Und für die nächste Objektdatei sind die Annahmen des Compilers, wo sich f () in der V-Tabelle der Klasse befindet, falsch.

Oft hilft es einfach, die Welt neu zu kompilieren (alles!).


  • Stellen Sie sicher, dass Sie in Ihrem Projekt keine alte Version einer Bibliothek ausgewählt haben, dh Sie haben (wie von Adam erwähnt) eine ältere Debug-Version anstelle einer aktuellen Version gewählt oder umgekehrt.

  • Möglicherweise müssen Sie neu erstellen.

  • Achten Sie auch auf die bedingte Kompilierung, bei der ein Makro an einem bestimmten Punkt #definiert oder #undefiniert werden kann (die andere Lösung kann einige Makros oder projizierte #defines haben). Manchmal ist es hilfreich, Ihre .lib .obj- und vorkompilierten Header-Caches mit Neuerstellung zu löschen.

  • Es gibt eine entfernte Möglichkeit, dass etwas in Ihrer IDE oder Projektkonfiguration durcheinander gebracht wird, wo Sie möglicherweise Ihr Projekt von Grund auf neu erstellen müssen.

  • Ich bin nicht vertraut mit MS VC, können Sie die Projektdatei der Bibliothek aus der anderen Lösung hinzufügen? Zum Beispiel können Sie in Borland C ++ Builder Projektgruppen definieren und mehrere Projekte erstellen / erstellen. Ich lege die Projekte für die Bibliotheken, die ich verwende, immer in meine Programmprojektgruppe, damit alles beim Build auf den neuesten Stand kommt.





stack-pointer