2011-11-02 119 views
5

我正試圖修復libxml2中的錯誤。當使用--prefix=/Server/software時,我無法使用--with-icu進行編譯。我已經提交了一個bug report here,但是我需要編譯它來編譯支持intl的PHP時解決衝突。我懷疑這是Makefile的問題。我對Makefile的使用經驗有限。想要的結果是提出一個補丁,可以提交給鏈接的錯誤報告。如何修補libxml2,以便在使用前綴時支持ICU編譯?

--with-icu標誌導致LIBXML_ICU_ENABLED被定義。包含的代碼在包含來自icu和libxml2的頭文件(尤其是使用UChar)時應該解決衝突。用--enable-intl激活的PHP插件intl需要icu。 PHP爲DOM/XML功能需要libxml2。

有兩個問題。

首先,此配置:在

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

結果:

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

發生這種情況的,因爲這在代碼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 

具體地說ICUCONFIG=icu-config不尊重--prefix=/Server/software。我可以通過做export PATH=/Server/software/bin:$PATH來解決這個問題。

這個「修復」./configure問題。

其次,當我運行make我得到的錯誤,最relavent之中:

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

unicode/uncv.h文件是/Server/software/include/unicode/uncv.h。我懷疑編譯器正在本地目錄和我的/ usr目錄中查找這個文件。

這是錯誤指的是:

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

顯然,這是一個路徑問題,使用--with-icu--prefix=/Server/software時。沒有--with-icu它編譯得很好,但是在編譯具有icu和libxml2的PHP時,需要解決定義的UChar衝突。

icu-config --cflags結果是:

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

這是正在管道輸送到的/ dev/null的。

icu-config --ldflags結果是:

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

有什麼需要改變,以解決這些問題?

+0

我已經發布了一個補丁用於ICU_CONFIG問題:https://bugzilla.gnome.org/show_bug.cgi?id=663214 –

回答

2

所以,看看它在哪裏使用icu-config。它應該做類似icu-config --cppflags這應該設置-I/Server/Software/include或類似。你可以通過設置CPPFLAGS來自己包含這樣一個參數來解決它。

您可以在錯誤之前立即包含實際的編譯命令行嗎?

聽起來像是libxml中的一個錯誤 - 它應該爲icu-config搜索$ {PREFIX}/bin。

此外,ICU現在導出pkg-config文件,這是更多的標準方式來找到這樣的項目。


WITH_ICU前試試這個:

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

更新我要引用盧克的最後答覆。很高興它的工作。

我解決了鏈接器的問題,所以現在一切正常。對於這個問題 使用libxml 2.7.7是解決方案。看起來OX X 10.6配有 2.7.8。所以爲了工作,你必須用2.7.7自己編譯libxml2。鏈接器問題可以通過在PHP的./configure之前添加LIBS =「 - lresolv -lstdC++」來解決。如果安裝到非標準位置,還需要使用 --enable-rpath編譯ICU。我已經接受你的答案。隨時用這個信息更新:)。 - 路加福音17小時前

+0

我更新了問題,包括較爲relavent部分configure.in和在'configure.in'中使用時的icu-config輸出。看起來'icu-config --ldflags'應該通過'/ Server/software'來使包含在'encoding.h'中的工作,但是它沒有通過。試圖找到可能做類似的其他軟件包。 – Luke

+0

那麼這似乎已經解決了構建libxml2的問題。但是現在我的PHP配置失敗,檢查是否libxml構建工作...沒有。 config.log中的相關位是'configure:21707:gcc -o conftest -fvisibility = hidden -no-cpp-precomp -Wl,-rpath,/ Server/software/lib -L ​​/ Server/software/lib conftest.c '。不用'--with-icu'編譯libxml2 PHP很好(如果我不包含'--enable-intl',我需要)。 – Luke

+0

@Luke php中的config.log是什麼意思? Intl使用ICU,因爲我認爲你知道。 intl正在使用與libxml2相同的ICU,對吧? –