2011-07-14 2 views
2

ICU4Cユニコードライブラリをバージョン4.2.1(Ubuntu 10.04にパッケージ化されているバージョン)で使用します。私は簡単なテストコードを作った。正規表現オブジェクトを開くだけです。静的リンクICU4Cがuregex関数を失敗させる

#include <stdio.h> 
#include <unicode/utypes.h> 
#include <unicode/uregex.h> 

int main() { 
    UChar zPattern[4] = {'a', 'b', 'c', 0}; 
    UErrorCode status = 0; 
    URegularExpression *pExpr = uregex_open(zPattern, -1, 0, 0, &status); 
    return status; 
}; 

私は、動的にリンクされたICUライブラリを使用してコンパイルし、実行しました、以下のように:

gcc -o test.out test.c -licui18n -licuuc -licudata -lpthread -lm 
./test.out 

と結果ステータスコードは '0' でした。魅力的に働いた。

は今、私は静的に以下のようなICUライブラリをリンクすることを決めた、と

gcc -o test.out -DU_STATIC_IMPLEMENTATION test.c -lsicui18n -lsicuuc -lsicudata -lpthread -lstdc++ -lm 
./test.out 

と結果のステータスコードを実行した「1」でした。 uregex_open関数がステータスコード 'U_ILLEGAL_ARGUMENT_ERROR'で失敗しました。

私は静的にICU4Cをリンクするものがありませんでしたか?

答えて

3

ヒットしたlibsicudataをチェックしてください。おそらく「スタブ」でしょう。 ICUのデータを静的ライブラリとしてロードするには、数MBのlibicusdataにする必要があります。

ICUの読み込みの問題をデバッグするには、まずu_init(&status)に電話して、ICUがそのデータを読み込むことができるかどうかを確認します。私はubuntuがICUをどのように構築しているのか分かりません。おそらく、データが(ファイルからのように)別の方法で読み込まれます。

+0

私は、ubuntuにパッケージされているlibsicudata.aファイルが非常に小さいことを知りました(約1kb)。私は、このライブラリファイルの外に存在するかもしれないデータファイルをどのように使用できるかを理解できませんでした。だから私は静的なicuライブラリを自分で構築し、私のプロジェクトにリンクさせることにしました。どうもありがとう! – araste

+0

ようこそ!たぶん何かについてバグを報告する何か。もう1つの選択肢は、Macプラットフォーム上の/usr/share/icu/icudt*.datなどのファイルからデータをロードすることです。プロジェクトのニーズに応じて(たとえば、変換、照合、ロケールなどのデータが必要ない場合もあります)、データカスタマイザを使用してデータをカスタマイズすることで、スペースを節約できます。 http://userguide.icu-project.org/icudataを参照してください。 –

関連する問題