2010-06-05 2 views
8

libtidy를 사용하는 C++의 확장을 작성했으며 PHP --with-tidy을 컴파일하면 PHP에서 완벽하게 실행됩니다.libtidy를 사용하는 PHP 확장은 컴파일되지만로드되지 않습니다

그러나 바닐라 PHP에서 확장 프로그램을 실행하는 것이 좋을 것입니다. 확장 프로그램을 사용하려고하면 다음과 같은 메시지가 표시됩니다.

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

확장자가로드되지 않습니다.

공식적으로 깔끔한 확장 기능이 제대로 작동합니다. 관련 libtidy 개발 패키지가 시스템에 설치되어 있고 문제없이 + 링크가 컴파일됩니다. 나는 깔끔한 확장을위한 코드를 살펴 보려고 노력했지만 매크로 코드는 엄청나게 많습니다. 조각을 무작위로 복사하는 것은화물 코드처럼 느껴졌습니다.

으로 라이브러리에 연결하는 것 외에이 오류를 수정하는 PHP 확장 또는 C 문이 있습니까?

미리 감사드립니다.

편집 :

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

관련 문제