2011-07-14 22 views
2

我打算在版本4.2.1(Ubuntu 10.04中打包的版本)中使用ICU4C unicode库。我做了一个简单的测试代码;只需打开一个正则表达式对象。静态链接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的libicus数据。

要调试ICU加载问题,请首先拨打u_init(&status),这将查看ICU是否可以加载其数据。我不知道ubuntu如何构建ICU,也许数据以不同的方式加载(如从文件中加载)。

+0

我发现在Ubuntu下打包的libsicudata.a文件非常小(约1kb)。我无法弄清楚如何使用可能驻留在这个库文件之外的数据文件。所以我决定自己建立静态icu库并与我的项目链接。非常感谢! – araste

+0

欢迎!也许有些东西要提交一个bug。另一种选择可能是数据是从文件加载的,例如Mac平台上的/usr/share/icu/icudt*.dat。根据您项目的需要(例如,您可能不需要转换,整理或区域设置数据),您可以通过使用数据定制程序自定义数据来节省一些空间。请参阅http://userguide.icu-project.org/icudata –