如何使用ICU编译SQLite?

7
3个回答

11

1)你可以将它编译为SQLite的动态扩展。 引用http://www.sqlite.org/cvstrac/fileview?f=sqlite/ext/icu/README.txt

The easiest way to compile and use the ICU extension is to build and use it as a dynamically loadable SQLite extension. To do this using gcc on *nix:

gcc -shared icu.c `icu-config  --cppflags --ldflags` -o libSqliteIcu.so

You may need to add "-I" flags so that gcc can find sqlite3ext.h and sqlite3.h. The resulting shared lib, libSqliteIcu.so, may be loaded into sqlite in the same way as any other dynamically loadable extension.

(在SQLite提示符中加载.load libSqliteIcu.so正在加载)

2) 您可以启用ICU编译SQLite。根据http://www.sqlite.org/compile.html,您应该定义宏SQLITE_ENABLE_ICU

-DSQLITE_ENABLE_ICU添加到CFLAGS变量中或在某个配置文件中添加#define SQLITE_ENABLE_ICU

好的,这里有一些标准文档中未描述的内容。以下是启用ICU的configure调用示例:

 CFLAGS='-O3 -DSQLITE_ENABLE_ICU' CPPFLAGS=`icu-config --cppflags` LDFLAGS=`icu-config --ldflags` ./configure

您还需要安装icu-config程序(它来自于libiculibicu-dev包)。


如果您有动态的libicu.so (您肯定会有),它将动态链接。要更改为静态链接,请运行icu-config --ldflags并检查其输出是否包含-Bstatic或-Bdynamic。如果没有,则将LDFLAGS更改为LDFLAGS="-Wl,-Bstatic "\icu-config --ldflags`" -Wl,-Bdynamic"`。 - osgx
我得到了sqlite3.c:(.text+0xcb64b): undefined reference to `utf8_nextCharSafeBody_3_6'。 - Vivek Goel
不要忘记安装ICU和SQLite3开发包 sudo apt update && sudo apt install libicu-dev libsqlite3-dev -y - pouya

3
无论您是启用icu还是只是使用icu扩展,这取决于您想要对icu做什么。
如果您需要icu分词器(用于执行fts),则需要构建汇编;如果您只需要icu函数作为https://www.sqlite.org/cgi/src/dir?ci=6cb537bdce85e088&name=ext/icu列表,则icu扩展就足够了。
在构建icu扩展时,我发现我不能像readme中所说的那样将其命名为libSqliteIcu.so,因为当我加载它时,我会得到这个错误。
sqlite> .load ./libSqliteIcu.so
Error: dlsym(0x7fa073e02c60, sqlite3_sqliteicu_init): symbol not found

sqlite邮件列表上提问后,我被告知确认了以下内容。

该符号名称为sqlite3_icu_init。当您加载模块lib<x>.so时,将调用符号sqlite3_<x>_init。您需要将共享库重命名为正确的名称(libicu.so)或在加载模块时向加载器传递init函数的名称(sqlite3_icu_init),或者在icu.c源文件中更改sqlite3_icu_init函数的名称,以使其与模块加载器正在查找的名称匹配...


0

要启用带有ICU的SQLite编译,您应该定义宏SQLITE_ENABLE_ICU

确保您已安装libicu-dev(在Debian / Ubuntu上)。

正如@osgx所写,标准文档缺少ICU特定的标志,您还需要设置这些标志。icu-config已被弃用,并且在Ubuntu 20.04及以后版本中缺失,因此您应改用pkg-config

CFLAGS="-O2 -DSQLITE_ENABLE_ICU `pkg-config --libs --cflags icu-uc icu-io`" ./configure
make

请参见:


在执行这些步骤时一切看起来都很正常,但是在使用tokenize=icu创建虚拟表时仍然出现错误:Error: unknown tokenizer: icu - ariefs
在安卓上持续出现这个错误: ...sqlite3.c:213388:10: 致命错误:找不到 'unicode/uregex.h' 文件#include <unicode/uregex.h> ^~~~~~~~~~~~~~~~~~ - aeroxr1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接