Как скомпилировать 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

Видеть:

Другие вопросы по тегам