2010-06-05 17 views
8

Ho scritto un'estensione in C++ che utilizza libtidy, e funziona perfettamente sotto PHP quando compilo il PHP --with-tidy.Estensione PHP usando libtidy compila, ma non carica

Tuttavia, sarebbe bello avere l'estensione eseguita su un PHP vaniglia. Quando provo a utilizzare l'estensione, ottengo qualcosa del tipo:

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

e l'estensione non è caricata.

Ovviamente, l'estensione di ordine ufficiale funziona correttamente. Ho i pacchetti di sviluppo libtidy rilevanti installati sul sistema e compila + link senza problemi. Ho cercato di esaminare il codice per l'estensione ordinata, ma si tratta di un'enorme massa di macro: copiare pezzi a caso sembrava codice del carico.

Oltre al collegamento alla libreria con , Esiste un'estensione PHP o un'istruzione C che corregge questo errore?

Grazie in anticipo !!

EDIT: qui è l'intero file 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

Fornire il file config.m4 completo – johannes

+0

Sono nuovo qui su StackOverflow. Abbiamo già abbandonato l'aggiunta di libtidy al progetto, e non so se dovrei rimuovere questa domanda o meno (le persone lo hanno preferito). Cosa dovrei fare? – eli

+0

@ewokker Lascialo. Qualcuno potrebbe rispondere. – Artefacto

risposta

1

ha si compila il proprio interno con la stessa versione di PHP come php vaniglia? dovresti usare sorgenti php con la stessa versione. inoltre, assicurarsi che nel file php.ini sia stata caricata l'estensione 'libtidy' prima dell'estensione.

+0

Grazie per la risposta. Come ho detto nel commento sopra, il progetto è andato avanti. Tuttavia, queste sembrano buone indicazioni da seguire per la risoluzione dei problemi la prossima volta. – eli

Problemi correlati