2013-02-15 6 views
17

Ich habe es geschafft, Qt5 mit dem Mingw-w64-Projekt-Compiler für 32-Bit-Windows (irgendwie) zu kompilieren. Alle Bibliotheken wurden unter ~/i686-w64-mingw32 installiert.Der Prozedur-Einstiegspunkt __gxx_personality_sj0 konnte nicht gefunden werden ...

Ich habe ein CMake-basiertes Qt-Projekt, das ich versuche, Kreuz-kompilieren. Indem ich these instructions folgte, konnte ich das Projekt kompilieren. So weit, ist es gut.

Leider, wenn die resultierenden binären unter Windows ausgeführt wird, ich am Ende einen Fehler bekommen:

"The procedure entry point __gxx_personality_sj0 could not be located in the dynamic link library [application_name].exe"

* [application_name] ist der vollständige Pfad zu dem ausführbaren Haupt

Ich habe gehört, Diese Art von Problem kann manchmal durch das Mischen von Bibliotheken verursacht werden, die mit verschiedenen Versionen von MinGW kompiliert wurden. Aber alles auf dieser Maschine (alle Bibliotheken und die ausführbare Datei) wurden alle vom selben Compiler (der i686-w64-mingw32 Toolchain) kompiliert.

Auch finde ich es seltsam, dass der Fehler beschwert, dass der Einstiegspunkt von der ausführbaren Anwendung statt einer der Dateien .dll fehlt.

Was könnte diesen Fehler verursachen und was kann getan werden, um es zu beheben?

+0

vielleicht verwenden Sie Software kompiliert mit einer anderen Version – didierc

+0

@didierc: Ich habe nur eine Version von Mingw-w64 installiert. –

+0

Ich frage mich, ob Sie eine Software mit einer anderen Version von Mingw kompiliert haben, nicht, wenn Sie eine andere Version von Mingw verwendet hätten. Ihre Antwort spiegelt genau meine Annahme wider, dass irgendwo eine andere Software eine mit einer anderen Version erstellte Lib verwendete und dass sie irgendwie mit Ihrer kompilierten Software interferierte. Ich nehme an, dass ich die Dinge nicht gut genug beschrieben habe, aber du hast es herausgefunden, großes Lob an dich! – didierc

Antwort

11

Am Ende stellte sich heraus, dass das Problem durch einen eigensinnigen libstdc++-6.dll irgendwo in $PATH verursacht wurde. Nachdem sichergestellt wurde, dass die von Mingw-w64 erstellte Kopie im Verzeichnis der Anwendung war, funktionierte alles.

+1

Danke! Ich hatte einen Fehler "Der Prozedur-Einstiegspunkt __gxx_personality_sj0 konnte nicht in der dynamischen Link-Bibliothek libstdC++ - 6.dll gefunden werden, und das Umbenennen von" c: \ Windows \ SysWOW64 \ libstdC++ - 6.dll "hat funktioniert! –

+1

Es ist praktisch, 'where libstdC++ - 6.dll' vor dem Erstellen von Quellen auszuführen. In meinem Fall hatte ich Anaconda-Installation in meiner PATH-Variable, bevor ich dort einstieg. –

+0

Ich löschte die DLL aus Windows-Verzeichnis und es funktionierte. Das heißt, das sind wahrscheinlich nicht die Anweisungen, die ich den Leuten am Telefon geben möchte, um mein Programm auf ihrem Computer o.o. Oh DLL Hölle ... – Dmitry

15

Suche nach der Lage der falschen Bibliothek:

  • Öffnen Sie die Eingabeaufforderung.
  • Typ "libstdC++ - 6.dll" und drücken Sie "Enter"
  • Ein Meldungsfeld mit einem Pfad und einer Nachricht angezeigt werden soll: c:/somefolder/SomeApp /.../ libstdC++ - 6.dllDieser Datei ist kein Programm zugeordnet ... usw. Der Pfad ist die Antwort.
  • Ausführen Ihrer App in einer IDE:% PATH% in der IDE könnte sein, die sich von der Eingabeaufforderung% PATH% in der Eingabeaufforderung unterscheidet (siehe IDE-Einstellungen). In diesem Fall, Putting "libstdC++ - 6.dll" in eine Batch-Datei und läuft der Stapel aus der IDE sollte zeigen, welche bestimmte Instanz der Bibliothek Ihr Programm abholt.

Meine persönliche Lösung:

  • Open "Systemeigenschaften" -> "Umgebungsvariablen" (in Windows 7, in meinem Fall) und vergewissern Sie sich, dass beide% PATH% Variablen (die Für Ihr Konto UND systemweite Variable% PATH%) beginnen Sie mit c: \ mingw \ bin (oder dem Pfad, den Sie für die Bibliothek haben). Außerdem müssen Sie möglicherweise Ihre IDE neu starten, damit sie den neuen Pfad aufnehmen können.

In meiner Erfahrung, MS Windows' Weg, um die Lage innerhalb des% PATH% der Wahl kann sehr unberechenbar sein. Letztes Mal habe ich eine Quelldatei mit einer einzigen Funktion hinzugefügt und diese Funktion in meinen Code aufgenommen. Das Programm würde immer die falsche libstdC++ - 6.dll auswählen, selbst wenn ich den Code der Funktion löschte und nur die Anweisung 'return' übrigließ. Jedes Mal, wenn diese Funktion auskommentiert (ausgeschlossen) wurde, würde das Programm wieder normal laufen. Ich vermute, dass Windows manchmal PATH aus "Systemvariablen" auswählt und "User-Variablen" PATH (den PATH Ihres Windows-Accounts) aus irgendeinem Grund vermeidet.