2012-04-30 19 views
7

Estoy tratando de cargar una extensión de PHP realizadas con SWIG, pero estoy consiguiendo el error siguiente cuando se inicia PHP:símbolo Indefinido al cargar la extensión php hecho con TRAGO

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 

La extensión que estoy tratando de cargar se encuentren libtg.so llamado y fue compilado con el comando:

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

donde libtg_wrap.o es el archivo de objeto para el código de contenedor generado por el TRAGO.

El símbolo que falta __gxx_personality_v0 se encuentra en libstdc++.so, como se desprende de la siguiente orden:

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

libstdc++.so se hace referencia en libtg.so, como se desprende de la siguiente 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) 

así que don No veo por qué no puede encontrar el símbolo. ¿Alguna idea sobre cómo puedo depurar esto aún más?

Respuesta

1

Parece que en algún lugar de su proceso de compilación, el compilador o el enlazador no conocía una fuente de C++.

Cuando probé Swig (también para crear una extensión de php), creé el siguiente Makefile que puede ser útil en su caso, por lo que es posible que desee personalizarlo para su proyecto y probarlo, es bastante directo.

Vea cómo tuve que especificar la opción "-C++" para el comando swig. Además, asegúrese de tener la extensión .cpp para sus archivos de origen y agregue "-lstdC++" a sus indicadores de enlazador.

las cosas importantes debe ser la invocación trago (tenga en cuenta la opción -C++):

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

y la invocación enlazador (nótese la bandera -lstdc):

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

creo que sirve

+0

¡Curiosamente, funcionó! Previamente estaba usando 'g ++' para enlazar en lugar de 'ld' directamente ... Me pregunto cuál es la diferencia. – HighCommander4

+0

En realidad, no debería haber una diferencia, puede vincular usando g ++. Como no muestra cómo compiló el archivo .o o cómo invocó el comando swig o cualquier otro detalle, no puedo decir mucho más ... ¡pero me alegro de que haya funcionado! :) – marcelog

+0

El archivo .o se compiló con 'g ++ \' php-config5 --includes \ '-c -fPIC -std = C++ 0x libtg_wrap.cpp', y el comando swig se invocó como' swig -php - C++ libtg.i'. – HighCommander4

Cuestiones relacionadas