Как связать исходный файл расширения SQlite в Xcode для iPhone? - PullRequest
3 голосов
/ 20 февраля 2010

Я использую статически связанную библиотеку для Sqlite в проекте iPhone Xcode. Сейчас я пытаюсь включить в этот проект расширение .C для Sqlite. Тем не менее, у меня возникают проблемы при создании Sqlite в сборке СМ. Расширение.

Статически связанная библиотека Sqlite работает нормально. Также расширение .C работает на моем рабочем столе и прекрасно работает как статически связанная библиотека в XCode. Однако определяемые им пользовательские функции отсутствуют при вызове.

Например, я загружаю расширение без ошибок.

SELECT load_extension('extension_name.so');

Но когда я пытаюсь вызвать функцию, определенную в расширении, я получаю это сообщение

DB Error: 1 "no such function: custom_function"

Кто-нибудь знает много о связывании расширения Sqlite в проекте Xcode?

Ответы [ 3 ]

5 голосов
/ 20 марта 2010

Как сказал @jbworld, вы не можете загружать динамические библиотеки на iPhone, поэтому эта ссылка должна создаваться статически во время компиляции. Читая код пространственного объекта (это расширение SQLite), я обнаружил такой вызов:

void spatialite_init (int verbose) {
/* used when SQLite initializes SpatiaLite via statically linked lib */
    sqlite3_auto_extension ((void (*)(void)) init_static_spatialite);
}

И init_static_spatialite код:

static void init_static_spatialite (sqlite3 * db, char **pzErrMsg,
            const sqlite3_api_routines * pApi)
{
    SQLITE_EXTENSION_INIT2 (pApi);
/* setting the POSIX locale for numeric */
    setlocale (LC_NUMERIC, "POSIX");
    *pzErrMsg = NULL;
    sqlite3_create_function (db, "spatialite_version", 0, SQLITE_ANY, 0,
                             fnct_spatialite_version, 0, 0);
    sqlite3_create_function (db, "proj4_version", 0, SQLITE_ANY, 0,
                             fnct_proj4_version, 0, 0);
    sqlite3_create_function (db, "geos_version", 0, SQLITE_ANY, 0,
                             fnct_geos_version, 0, 0);
    sqlite3_create_function (db, "GeometryConstraints", 3, SQLITE_ANY, 0,
                             fnct_GeometryConstraints, 0, 0);
    sqlite3_create_function (db, "CheckSpatialMetaData", 0, SQLITE_ANY, 0,
                             fnct_CheckSpatialMetaData, 0, 0);
...

Похоже, что sqlite_auto_extension позволяет вам статически связать расширение. Документация , кажется, подтверждает, что:

«Этот API можно вызвать при запуске программы, чтобы зарегистрировать одно или несколько статически связанных расширений, которые будут доступны для всех новых подключений к базе данных».

Затем во время выполнения для пространственного объекта я просто должен вызвать spatialite_init(0), чтобы запустить и запустить расширение.

Вызовите такой метод перед загрузкой любой базы данных sqlite.

Надеюсь, это поможет.

0 голосов
/ 20 февраля 2010

Функция load_extension загружает общую библиотеку (.so). Это не разрешено на iPhone. Вам нужно будет перекомпилировать статическую библиотеку, чтобы включить расширение, которое вы хотите использовать.

0 голосов
/ 20 февраля 2010

Можно ли будет встроить свои пользовательские функции непосредственно в основной исполняемый файл и сообщить sqlite о них с помощью sqlite3_create_function ?

Я не знаю, какие детали применимы в этой ситуации, но я помню, что iPhone забавно загружает код во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...