2010-06-05 7 views
8

Escribí una extensión en C++ que usa libtidy, y funciona perfectamente bajo PHP cuando compilo PHP --with-tidy.Extensión PHP usando compilaciones libtidy, pero no carga

Sin embargo, sería bueno tener la extensión ejecutada en un PHP vainilla. Cuando trato de usar la extensión, obtengo algo como:

 
PHP Warning: 
    PHP Startup: 
    Unable to load dynamic library 'extension.so': 
     undefined symbol: tidyCleanAndRepair in Unknown on line 0 

y la extensión no está cargada.

Obviamente, la extensión ordenada oficial funciona bien. Tengo los paquetes de desarrollo de libtidy relevantes instalados en el sistema, y ​​compila + enlaces sin ningún problema. He intentado buscar en el código la extensión ordenada, pero es una gran cantidad de macros: al copiar piezas al azar se sentía como código de carga.

Además de vincular a la biblioteca con , ¿hay una extensión PHP o una sentencia C que solucione este error?

Gracias de antemano!

EDIT: aquí está todo el archivo config.m4:

dnl config.m4 for extension htmlparser 

PHP_ARG_ENABLE(htmlparse, whether to enable htmlparser support, 
[ --enable-htmlparser   Enable htmlparser support]) 

if test "$PHP_HTMLPARSER" != "no"; then 


    if test -r $PHP_LIBXML2/lib/libxml2.a; then 
    LIBXML2_DIR=$PHP_LIBXML2 
    else 
    AC_MSG_CHECKING(for libxml2 in default path) 
    for i in /usr/local /usr; do 
     if test -r $i/lib/libxml2.a; then 
     LIBXML2_DIR=$i 
     AC_MSG_RESULT(found in $i) 
     fi 
    done 
    fi 

    if test -z "$LIBXML2_DIR"; then 
    AC_MSG_RESULT(not found) 
    AC_MSG_ERROR(Please reinstall the libxml2 distribution - libxml2.h should 
       be in <libxml2-dir>/include and libxml2.a should be in <libxml2- dir>/lib) 
    fi 
    PHP_ADD_INCLUDE($LIBXML2_DIR/include/libxml2) 
    PHP_ADD_LIBRARY_WITH_PATH(libxml2, $LIBXML2_DIR/lib, LIBXML2_SHARED_LIBADD) 

    AC_MSG_CHECKING(for boost in default path) 
    for i in /usr/local /usr; do 
    if test -r $i/include/boost; then 
     BOOST_DIR=$i 
     AC_MSG_RESULT(found in $i) 
    fi 
    done 

    if test -z "$BOOST_DIR"; then 
    AC_MSG_RESULT(not found) 
    AC_MSG_ERROR(Please reinstall the boost distribution!!!) 
    fi 
    PHP_ADD_INCLUDE($BOOST_DIR/include/boost/) 


    TIDY_SEARCH_DIRS="/usr/local /usr" 
    for i in $TIDY_SEARCH_DIRS; do 
     if test -f $i/include/tidy/tidy.h; then 
      TIDY_DIR=$i 
      TIDY_INCDIR=$i/include/tidy 
     elif test -f $i/include/tidy.h; then 
      TIDY_DIR=$i 
      TIDY_INCDIR=$i/include 
     fi 
    done 


    if test -z "$TIDY_DIR"; then 
     AC_MSG_ERROR(Cannot find libtidy) 
    fi 

    TIDY_LIBDIR=$TIDY_DIR/lib 

    PHP_ADD_INCLUDE($TIDY_INCDIR) 
    PHP_ADD_LIBRARY_WITH_PATH(tidy, $TIDY_LIBDIR, TIDY_SHARED_LIBADD) 

    PHP_CHECK_LIBRARY(tidy,tidyOptGetDoc, 
    [ 
    AC_DEFINE(HAVE_TIDYOPTGETDOC,1,[ ]) 
    ],[],[]) 

    AC_DEFINE(HAVE_HTMLPARSER, 1, [Whether you want htmlparser support]) 
    PHP_SUBST(HTMLPARSER_SHARED_LIBADD) 
    PHP_ADD_LIBRARY_WITH_PATH(stdc++, 1, HTMLPARSER_SHARED_LIBADD) 
    PHP_REQUIRE_CXX() 
    PHP_NEW_EXTENSION(htmlparser, php_htmlparser.cpp parsehtml.cpp StringBuilder.cpp,  $ext_shared) 
fi 
+0

Proporcione el archivo completo config.m4 – johannes

+0

Soy nuevo aquí en StackOverflow. Ya hemos abandonado agregar libtidy al proyecto, y no sé si debería eliminar esta pregunta o no (la gente lo ha favorecido). ¿Que debería hacer? – eli

+0

@ewokker Déjalo. Alguien podría responder. – Artefacto

Respuesta

1

hicieron compila su extensión con la misma versión de php php como la vainilla? deberías usar fuentes php con la misma versión. además, asegúrese de que en el archivo php.ini haya cargado la extensión 'libtidy' antes de su extensión.

+0

Gracias por la respuesta. Como mencioné en el comentario anterior, el proyecto ha avanzado. Sin embargo, estas parecen buenas indicaciones para tomar al solucionarlo la próxima vez. – eli

Cuestiones relacionadas