2010-06-05 6 views
8

लोड नहीं करता है मैंने सी ++ में एक एक्सटेंशन लिखा है जो libtidy का उपयोग करता है, और जब मैं PHP --with-tidy संकलित करता हूं तो यह PHP के नीचे पूरी तरह से चलता है।libtidy compiles का उपयोग करके PHP एक्सटेंशन, लेकिन

हालांकि, यह विस्तार अच्छा होगा कि विस्तार एक वेनिला PHP पर चलाना अच्छा लगे। जब मैं एक्सटेंशन का उपयोग करने का प्रयास करता हूं, तो मुझे कुछ मिलता है:

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

और एक्सटेंशन लोड नहीं होता है।

जाहिर है, आधिकारिक साफ विस्तार ठीक काम करता है। मेरे पास सिस्टम पर प्रासंगिक libtidy विकास संकुल स्थापित हैं, और यह बिना किसी समस्या के + लिंक संकलित करता है। मैंने साफ विस्तार के लिए कोड को देखने की कोशिश की है, लेकिन यह मैक्रोज़ का एक विशाल द्रव्यमान है - यादृच्छिक रूप से कार्गो कोड की तरह लगने वाले टुकड़े कॉपी करना।

के साथ लाइब्रेरी से जोड़ने के अलावा, क्या कोई PHP एक्सटेंशन या सी कथन है जो इस त्रुटि को हल करता है?

अग्रिम धन्यवाद !!

संपादित करें:

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

कृपया पूरी config.m4 फ़ाइल – johannes

+0

प्रदान करें मैं यहां StackOverflow पर नया हूं। हमने परियोजना में libtidy जोड़ने पहले से ही छोड़ दिया है, और मुझे नहीं पता कि मुझे इस सवाल को हटा देना चाहिए या नहीं (लोगों ने इसका पक्ष लिया है)। मुझे क्या करना चाहिए? – eli

+0

@ewokker इसे छोड़ दें। कोई जवाब दे सकता है। – Artefacto

उत्तर

1

आप एक वेनिला php के रूप में ही PHP संस्करण के साथ अपने एक्सटेंशन संकलन किया: यहां पूरे config.m4 फ़ाइल है? आपको उसी संस्करण के साथ PHP स्रोतों का उपयोग करना चाहिए। इसके अलावा, सुनिश्चित करें कि php.ini फ़ाइल में आपने अपने एक्सटेंशन से पहले 'libtidy' एक्सटेंशन लोड किया था।

+0

उत्तर के लिए धन्यवाद। जैसा कि मैंने ऊपर टिप्पणी में उल्लेख किया है, परियोजना चालू हो गई है। हालांकि, ये अगली बार समस्या निवारण करते समय लेने के लिए अच्छी दिशाओं की तरह लगते हैं। – eli

संबंधित मुद्दे