如何将SQlite扩展源文件链接到iPhone的Xcode?

pch*_*10k 3 sqlite iphone xcode

我在iPhone Xcode项目中为Sqlite使用了静态链接库。我现在正在尝试在该项目中包括对Sqlite的.C扩展名。但是,我在使Site扩展中的Sqlite扩展时遇到麻烦。

静态链接的Sqlite库工作正常。.C扩展名也可以在我的桌面上使用,并且可以很好地构建为Xcode中的静态链接库。但是,它定义的自定义函数在调用时会丢失。

例如,我以没有错误的方式加载扩展。

SELECT load_extension('extension_name.so');
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试调用扩展中定义的函数时,却收到此消息

DB Error: 1 "no such function: custom_function"
Run Code Online (Sandbox Code Playgroud)

有谁知道如何将Sqlite扩展链接到Xcode项目中?

yon*_*nel 5

正如@jbworld所说,您无法在iPhone上加载动态库,因此应在编译时静态创建此链接。在阅读spacespaceite(这是SQLite扩展)的代码时,我发现了这种调用:

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

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);
...
Run Code Online (Sandbox Code Playgroud)

因此,如果sqlite_auto_extension使您能够静态链接扩展,则它看起来像。该文档似乎确认:

“可以在程序启动时调用此API,以注册一个或多个静态链接的扩展,这些扩展将可用于所有新的数据库连接。”

然后,在运行时,对于spacespaceite,我只需调用spatialite_init(0)即可启动并运行扩展。

加载任何sqlite数据库之前调用此方法。

希望这可以帮助。