我将使用版本为4.2.1的ICU4C unicode库(该版本包装在Ubuntu 10.04中)。我做了一个简单的测试代码;只需打开一个正则表达式对象。
#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的内容?
答案 0 :(得分:3)
检查你最终击中的libsicudata - 它可能是'stub'。如果您希望将ICU的数据作为静态库加载,它应该是一个数兆的libicus数据。
要调试ICU加载问题,请先调用u_init(&status)
,这将查看ICU是否可以加载其数据。我不知道ubuntu如何构建ICU,也许数据以不同的方式加载(例如从文件中加载)。