2012-04-30 15 views
7

Sto cercando di caricare un'estensione PHP effettuate utilizzando SWIG, ma sto ottenendo il seguente errore quando si avvia PHP:simbolo indefinito quando si carica estensione PHP realizzato con SWIG

PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/libtg.so' - /usr/lib/php5/20090626/libtg.so: undefined symbol: __gxx_personality_v0 in Unknown on line 0 

L'estensione che sto cercando di caricare è chiamato libtg.so ed è stato compilato con il comando:

g++ -shared libtg_wrap.o -o libtg.so 

dove libtg_wrap.o è il file oggetto per il codice wrapper generato da SWIG.

Il simbolo mancante __gxx_personality_v0 si trova in libstdc++.so, come evidente dalla seguente comando:

$ nm -D /usr/lib/libstdc++.so.6 | grep __gxx_personality_v0 
00000000000b9990 T __gxx_personality_v0 

libstdc++.so è indicizzato nei libtg.so, come evidente dalla seguente comando:

$ ldd libtg.so 
linux-vdso.so.1 => (0x00007fff5f932000) 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f3fc937c000) 
libm.so.6 => /lib/libm.so.6 (0x00007f3fc90f9000) 
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f3fc8ee2000) 
libc.so.6 => /lib/libc.so.6 (0x00007f3fc8b5f000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f3fc98fc000) 

così don vediamo perché non riesce a trovare il simbolo. Qualche idea su come posso debellare ulteriormente questo?

risposta

1

Sembra che da qualche parte nel processo di compilazione, il compilatore o il linker non fosse a conoscenza di un sorgente C++.

Quando ho provato swig (anche per creare un'estensione php), ho creato il seguente Makefile che potrebbe essere utile nel tuo caso, quindi potresti voler personalizzarlo per il tuo progetto e provarlo, è piuttosto semplice.

Vedere come ho dovuto specificare l'opzione "-C++" al comando swig. Inoltre, assicurati di avere l'estensione .cpp per i tuoi file sorgente e aggiungi "-lstdC++" ai tuoi flag di linker.

La roba importante dovrebbe essere l'invocazione sorso (notare l'-C++ opzionale):

${OUTPUTDIR}/${NAME}_swig.cpp: 
    ${SWIG} -outdir ${OUTPUTDIR} \ 
     -oh ${OUTPUTDIR}/${NAME}_swig.h \ 
     -o ${OUTPUTDIR}/${NAME}_swig.cpp \ 
     -c++ -php \ 
     ${NAME}.i 

e l'invocazione linker (notare la bandiera -lstdc):

ld -shared ${OUTPUTDIR}/*.o -o ${OUTPUTDIR}/${NAME}.so -lstdc++ 

Speranza che aiuta

+0

È interessante notare che ha funzionato! Precedentemente stavo usando 'g ++' per collegare piuttosto che 'ld' direttamente ... Mi chiedo quale sia la differenza. – HighCommander4

+0

In realtà, non ci dovrebbe essere alcuna differenza, puoi collegarti usando g ++. Dato che non stai mostrando come hai compilato il file .o o come hai richiamato il comando swig o altri dettagli, non posso dire altro ... ma sono contento che abbia funzionato! :) – marcelog

+0

Il file .o è stato compilato con 'g ++ \' php-config5 --include \ '-c -fPIC -std = C++ 0x libtg_wrap.cpp', e il comando swig è stato invocato come' swig -php - C++ libtg.i'. – HighCommander4

Problemi correlati