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?
È interessante notare che ha funzionato! Precedentemente stavo usando 'g ++' per collegare piuttosto che 'ld' direttamente ... Mi chiedo quale sia la differenza. – HighCommander4
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
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