2011-11-02 25 views
5

Tôi đang cố khắc phục lỗi trong libxml2. Tôi không thể làm cho nó biên dịch với --with-icu khi sử dụng --prefix=/Server/software. Tôi đã gửi bug report here, nhưng tôi cần làm cho nó biên dịch để giải quyết xung đột khi biên dịch PHP với hỗ trợ intl. Tôi nghi ngờ đó là một vấn đề với Makefile. Kinh nghiệm của tôi với Makefile's bị hạn chế. Kết quả mong muốn được đưa ra với một bản vá có thể được gửi đến báo cáo lỗi được liên kết.Làm cách nào để vá libxml2 để nó sẽ biên dịch với hỗ trợ ICU khi sử dụng tiền tố?

Cờ --with-icu làm cho LIBXML_ICU_ENABLED được xác định. Mã được bao gồm có nghĩa vụ giải quyết xung đột khi bao gồm tiêu đề từ cả icu và libxml2 (cụ thể, cả hai đều sử dụng UChar). Intl plugin PHP, được kích hoạt với --enable-intl, yêu cầu icu. libxml2 là cần thiết cho PHP cho các hàm DOM/XML.

Có hai vấn đề.

Thứ nhất, cấu hình này:

./configure --prefix=/Server/software --enable-shared --enable-static --with-icu

Kết quả trong:

configure: error: libicu config program icu-config not found

Điều này xảy ra vì mã này trong configure.in:

WITH_ICU=0 
if test "$with_icu" != "yes" ; then 
    echo Disabling ICU support 
else 
    ICU_CONFIG=icu-config 
    if ${ICU_CONFIG} --cflags >/dev/null 2>&1 
    then 
     ICU_LIBS=`icu-config --ldflags` 
     LDFLAGS="$LDFLAGS $ICU_LIBS" 
     WITH_ICU=1 
     echo Enabling ICU support 
    else 
     AC_MSG_ERROR([libicu config program icu-config not found]) 
    fi 
fi 

Cụ ICUCONFIG=icu-config không tôn trọng --prefix=/Server/software. Tôi có thể giải quyết vấn đề này bằng cách thực hiện export PATH=/Server/software/bin:$PATH.

Điều này "khắc phục" sự cố ./configure.

Thứ hai, khi tôi chạy make tôi nhận lỗi, những con người relavent nhất:

./include/libxml/encoding.h:31:26: error: unicode/ucnv.h: No such file or directory

File unicode/uncv.h là trong /Server/software/include/unicode/uncv.h. Tôi nghi ngờ trình biên dịch đang tìm kiếm tệp này trong thư mục cục bộ và trong thư mục/usr của tôi.

Đây là những gì các lỗi được đề cập đến:

#ifdef LIBXML_ICU_ENABLED 
#include <unicode/ucnv.h> 
#endif 

Rõ ràng đây là một vấn đề khi sử dụng đường --with-icu--prefix=/Server/software. Nếu không có --with-icu nó biên dịch tốt, nhưng điều này là cần thiết để giải quyết một xung đột UChar xác định khi biên dịch PHP với cả icu và libxml2.

Kết quả của icu-config --cflags là:

-O2 -Wall -ansi -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Wno-long-long

này đã được đường ống vào/dev/null.

Kết quả của icu-config --ldflags là:

-lpthread -lm -L/Server/software/lib -licui18n -licuuc -licudata -lpthread -lm

Những gì cần phải được thay đổi để giải quyết những vấn đề này?

+0

Tôi đã đăng một bản vá cho vấn đề ICU_CONFIG: https://bugzilla.gnome.org/show_bug.cgi?id=663214 –

Trả lời

2

Vì vậy, hãy xem nơi nó đang sử dụng icu-config.Nó phải làm một cái gì đó như icu-config --cppflags nên đặt -I/Server/Software/include hoặc tương tự. Bạn có thể làm việc xung quanh nó bằng cách thiết lập CPPFLAGS để bao gồm một tham số như vậy cho mình.

Bạn có thể bao gồm dòng lệnh biên dịch thực tế ngay trước khi xảy ra lỗi không?

Có vẻ như một lỗi trong libxml - bạn nên tìm kiếm $ {PREFIX}/bin cho icu-config.

Ngoài ra, ICU hiện xuất các tệp pkg-config, đây là một cách tiêu chuẩn hơn để tìm các mục như vậy.


Hãy thử điều này trước khi WITH_ICU:

ICU_CPPFLAGS=`icu-config --cppflags` 
    CPPFLAGS="$CPPFLAGS $ICU_CPPFLAGS" 

cập nhật Tôi sẽ trích dẫn câu trả lời cuối cùng của Luke. Vui vì nó hoạt động.

Tôi đã giải quyết được sự cố của trình liên kết, vì vậy hiện tại tất cả đều hoạt động. Đối với câu hỏi này sử dụng libxml 2.7.7 là giải pháp. Có vẻ như tàu OX X 10.6 có 2.7.8. Vì vậy, để nó hoạt động, bạn phải tự biên dịch libxml2 với 2.7.7. Các vấn đề liên kết được giải quyết bằng cách thêm LIBS = "- lresolv -lstdC++" ngay trước PHP ./configure. Nếu cài đặt vào một vị trí không chuẩn, bạn cũng cần phải biên dịch ICU với - đường chạy được. Tôi đã chấp nhận câu trả lời của bạn. Hãy cập nhật nó với thông tin này :). - Luke 17 giờ trước

+0

Tôi đã cập nhật câu hỏi để bao gồm các phần có liên quan nhiều hơn của configure.in và đầu ra của icu-config khi được sử dụng trong 'configure.in'. Nó xuất hiện 'icu-config --ldflags' được cho là để truyền'/Server/software' để làm công việc include trong 'encoding.h', nhưng nó không được thông qua. Đang cố gắng tìm các gói khác có thể làm điều tương tự. – Luke

+0

Điều đó dường như đã khắc phục được sự cố với việc xây dựng libxml2. Nhưng bây giờ cấu hình PHP của tôi không thành công với 'kiểm tra xem việc xây dựng libxml có hoạt động ... không'. Các bit relavant trong config.log là 'cấu hình: 21707: gcc -o conftest -fvisibility = hidden-no-cpp-precomp -Wl, -rpath,/Server/phần mềm/lib -L/Server/phần mềm/lib conftest.c '. Nếu không biên dịch libxml2 với '--with-icu' PHP thì tốt (nếu tôi không bao gồm' --enable-intl', mà tôi cần). – Luke

+0

@Luke config.log trong php nói gì? Intl sử dụng ICU như tôi cho rằng bạn biết. intl đang sử dụng cùng một ICU bạn đang sử dụng cho libxml2, phải không? –

Các vấn đề liên quan