2013-02-15 42 views
17

Sono riuscito a (in qualche modo) eseguire la compilazione incrociata di Qt5 con il compilatore del progetto Mingw-w64 per Windows a 32 bit. Tutte le librerie sono state installate su ~/i686-w64-mingw32.Impossibile trovare il punto di inserimento della procedura __gxx_personality_sj0 in ...

Ho un progetto Qt basato su CMake che sto tentando di compilare. Seguendo these instructions, sono stato in grado di compilare il progetto. Fin qui tutto bene.

Purtroppo, quando si esegue il binario risultante su Windows, io alla fine ottenere un errore:

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

* [nome_applicazione] è il percorso completo del file eseguibile principale

ho sentito che a volte questo tipo di problema può essere causato dalla combinazione di librerie compilate con versioni diverse di MinGW. Ma tutto su questa macchina (tutte le librerie e l'eseguibile) sono stati tutti compilati dallo stesso compilatore (la toolchain i686-w64-mingw32).

Inoltre, trovo strano che l'errore si lamenta del fatto che il punto di ingresso manchi dall'eseguibile dell'applicazione anziché da uno dei file .dll.

Cosa potrebbe causare questo errore e cosa si può fare per porvi rimedio?

+0

forse si sta utilizzando un software compilato con una versione diversa – didierc

+0

@didierc: ho solo una versione di Mingw-w64 installata. –

+0

Mi chiedevo se avessi un software compilato con una versione diversa di mingw, non se avessi usato una versione diversa di mingw. La tua risposta riflette esattamente la mia supposizione, che da qualche parte un altro software stava usando una lib prodotta con una versione diversa, e che in qualche modo interferiva con il tuo software compilato. Suppongo che non abbia detto le cose abbastanza bene, ma l'hai capito, grazie a te! – didierc

risposta

11

Alla fine, si è scoperto che il problema era causato da un ribelle libstdc++-6.dll da qualche parte in $PATH. Dopo aver verificato che la copia creata da Mingw-w64 si trovasse nella directory dell'applicazione, tutto funzionava.

+1

Grazie! Ho riscontrato un errore "Impossibile trovare il punto di ingresso della procedura __gxx_personality_sj0 nella libreria di collegamento dinamico libstdC++ - 6.dll", e il comando "c: \ Windows \ SysWOW64 \ libstdC++ - 6.dll" funzionava! –

+1

È conveniente eseguire 'where libstdC++ - 6.dll' prima di creare fonti. Nel mio caso ho avuto l'installazione di Anaconda nella mia variabile PATH prima di entrare mingw lì. –

+0

Ho eliminato la DLL dalla directory di Windows e ha funzionato. Detto questo, probabilmente non sono le istruzioni che voglio dare alle persone al telefono per far funzionare il mio programma sul loro computer. O.o. Oh diavolo di DLL ... – Dmitry

15

Trovare la posizione della libreria sbagliato:

  • prompt dei comandi Apri.
  • Type "libstdC++ - 6.dll" e premere "Invio"
  • una finestra di messaggio dovrebbe apparire con un percorso e un messaggio: c:/somefolder/someapp /.../ libstdC++ - 6.dllQuesto file non ha un programma ad esso associato ... ecc., Il percorso è la risposta.
  • L'esecuzione dell'app all'interno di un IDE:% PATH% in IDE potrebbe essere diversa dal% PATH% nel prompt dei comandi (vedere Impostazioni IDE). Nel caso , inserendo "libstdC++ - 6.dll" in un file batch ed eseguendo il batch dall'interno dell'IDE dovrebbe mostrare quale particolare istanza è della libreria che il programma sta prelevando.

La mia soluzione personale:

  • Open "Proprietà del sistema" -> "Variabili d'ambiente" (in Windows 7, nel mio caso) e fare in modo che entrambe le variabili% PATH% (quella per il tuo account AND% variabile di sistema% PATH%) inizia con c: \ mingw \ bin (o qualsiasi percorso tu abbia per la libreria). Inoltre, potrebbe essere necessario riavviare l'IDE affinché riprenda il nuovo PERCORSO.

Nella mia esperienza, modo di scegliere la posizione all'interno del% PATH% MS Windows' può essere molto irregolare. L'ultima volta, ho aggiunto un file sorgente con una singola funzione e incluso quella funzione nel mio codice. Il programma sceglieva sempre il libstdC++ - 6.dll sbagliato anche quando cancellavo tutto il codice della funzione e lasciavo solo l'istruzione 'return'. Ogni volta che la funzione veniva commentata (esclusa), il programma funzionava normalmente di nuovo. Ho il sospetto che a volte Windows sceglie PATH da "Variabili di sistema" ed evita "PATH variabili utente" (PATH dell'account Windows) per qualche motivo.

Problemi correlati