2010-06-05 1 views
8

J'ai écrit une extension en C++ qui utilise libtidy, et elle fonctionne parfaitement sous PHP quand je compile PHP --with-tidy.PHP Extension utilisant libtidy compiles, mais ne charge pas

Cependant, ce serait bien que l'extension soit exécutée sur un PHP en vanille. Lorsque j'essaie d'utiliser l'extension, je reçois quelque chose comme:

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

et l'extension n'est pas chargée.

Évidemment, l'extension officielle de rangement fonctionne bien. J'ai les paquets de développement libtidy appropriés installés sur le système, et il compile + liens sans problème. J'ai essayé de chercher dans le code pour l'extension propre, mais c'est une énorme masse de macros - copier des morceaux au hasard se sentait comme le code de fret. Outre la liaison à la bibliothèque avec , existe-t-il une extension PHP ou une instruction C qui corrige cette erreur?

Merci d'avance !!

EDIT: voici l'intégralité du fichier 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

Veuillez fournir le fichier config.m4 complet – johannes

+0

Je suis nouveau chez StackOverflow. Nous avons déjà abandonné l'ajout de libtidy au projet, et je ne sais pas si je devrais supprimer cette question ou non (les gens l'ont favorisé). Que devrais-je faire? – eli

+0

@eokokker Laissez-le. Quelqu'un pourrait répondre. – Artefacto

Répondre

1

avez-vous compilez votre poste avec la même version php comme php vanille? vous devriez utiliser des sources php avec la même version. d'ailleurs, assurez-vous que dans le fichier php.ini vous avez chargé l'extension 'libtidy' avant votre extension.

+0

Merci pour la réponse. Comme je l'ai mentionné dans le commentaire ci-dessus, le projet a évolué. Cependant, ceux-ci semblent être de bonnes indications à suivre lors du dépannage la prochaine fois. – eli

Questions connexes