2010-06-05 13 views
8

Tôi đã viết một phần mở rộng trong C++ sử dụng libtidy, và nó chạy hoàn toàn dưới PHP khi tôi biên dịch PHP --with-tidy.Mở rộng PHP bằng cách sử dụng các biên dịch libtidy, nhưng không tải

Tuy nhiên, sẽ tốt hơn nếu chạy tiện ích mở rộng trên một vani PHP. Khi tôi cố gắng sử dụng tiện ích mở rộng, tôi nhận được một số thông tin như:

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

và tiện ích không được tải.

Rõ ràng, tiện ích mở rộng chính thức gọn gàng hoạt động tốt. Tôi có các gói phát triển libtidy có liên quan được cài đặt trên hệ thống, và nó biên dịch + liên kết mà không có vấn đề gì. Tôi đã cố gắng xem xét mã cho phần mở rộng gọn gàng, nhưng nó là một khối lượng lớn các macro - các bản sao chép ngẫu nhiên có cảm giác giống như mã hàng hóa.

Bên cạnh việc liên kết tới thư viện với , Có phần mở rộng PHP hoặc câu lệnh C sửa lỗi này không?

Cảm ơn trước !!

EDIT: đây là toàn bộ tập tin 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

Vui lòng cung cấp tệp config.m4 đầy đủ – johannes

+0

Tôi mới ở đây tại StackOverflow. Chúng tôi đã từ bỏ việc thêm libtidy vào dự án, và tôi không biết tôi có nên xóa câu hỏi này hay không (mọi người đã yêu thích nó). Tôi nên làm gì? – eli

+0

@ewokker Rời khỏi nó. Ai đó có thể trả lời. – Artefacto

Trả lời

1

đã bạn biên dịch phần mở rộng của bạn với các phiên bản php giống như một php vani? bạn nên sử dụng các nguồn php với cùng một phiên bản. ngoài ra, hãy chắc chắn rằng trong tệp php.ini bạn đã tải phần mở rộng 'libtidy' trước phần mở rộng của bạn.

+0

Cảm ơn câu trả lời. Như tôi đã đề cập trong phần bình luận ở trên, dự án đã chuyển sang. Tuy nhiên, những điều này có vẻ như các hướng tốt để thực hiện khi khắc phục sự cố vào lần tiếp theo. – eli