Как скомпилировать sqlite с ICU?
Я скачал sqlite с http://www.sqlite.org/sqlite-autoconf-3070701.tar.gz
Как я могу скомпилировать sqlite с icu?
3 ответа
1) Вы можете скомпилировать его как динамическое расширение SQLite Citing http://www.sqlite.org/cvstrac/fileview?f=sqlite/ext/icu/README.txt
Самый простой способ скомпилировать и использовать расширение ICU - это создать и использовать его как динамически загружаемое расширение SQLite. Для этого используйте gcc на *nix:
gcc -shared icu.c `icu-config --cppflags --ldflags` -o libSqliteIcu.so
Вам может понадобиться добавить флаги "-I", чтобы gcc мог найти sqlite3ext.h и sqlite3.h. Получившаяся общая библиотека libSqliteIcu.so может быть загружена в sqlite так же, как и любое другое динамически загружаемое расширение.
(загрузка .load libSqliteIcu.so
в SQLite подскажите)
2) Вы можете скомпилировать SQLite с включенным ICU. Согласно http://www.sqlite.org/compile.html вы должны определить макрос SQLITE_ENABLE_ICU
:
добавлять -DSQLITE_ENABLE_ICU
в переменную CFLAGS или добавить #define SQLITE_ENABLE_ICU
в каком-то конфигурационном файле.
Хорошо, здесь есть что-то, что не описано в стандартной документации. Вот пример вызова configure с включенным ICU:
CFLAGS='-O3 -DSQLITE_ENABLE_ICU' CPPFLAGS=`icu-config --cppflags` LDFLAGS=`icu-config --ldflags` ./configure
Вы также должны иметь icu-config
программа установлена (она из libicu
или же libicu-dev
пакет)
Собираете ли вы объединение с включенным icu или просто расширением icu, зависит от того, что вы хотите сделать с icu.
Если вам нужен токенайзер icu (для выполнения fts), вам нужно создать объединение, если вам просто нужны функции icu в виде https://www.sqlite.org/cgi/src/dir?ci=6cb537bdce85e088&name=ext/icu списка, то Расширения icu достаточно.
При создании расширения icu я не могу назвать его libSqliteIcu.so
как тот readme сказал б / с, когда я загружаю его, я получил эту ошибку
sqlite> .load ./libSqliteIcu.so
Error: dlsym(0x7fa073e02c60, sqlite3_sqliteicu_init): symbol not found
После того, как я задал вопрос в списке рассылки sqlit, мне сказали, что я подтверждаю.
Имя символа - sqlite3_icu_init. Когда вы загружаете модуль lib<x>.so
символ sqlite3_<x>_init
называется. Вам нужно либо (а) переименовать общую библиотеку на правильное имя (libicu.so
) или передать имя функции инициализации (sqlite3_icu_init) загрузчику при загрузке модуля, или (b) изменить имя sqlite3_icu_init
функция в icu.c
источник, чтобы он соответствовал имени, которое ищет загрузчик модуля...
Чтобы скомпилировать SQLite с включенным ICU, вы должны определить макрос
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
Видеть: