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

时间:2010-02-20 18:18:19

标签: iphone xcode sqlite

我在iPhone Xcode项目中为Sqlite使用静态链接库。我现在正试图在这个项目中包含一个.c扩展名到Sqlite。但是,我在构建中使用Sqlite时遇到问题SEE扩展。

静态链接的Sqlite库工作正常。此.C扩展也适用于我的桌面,并在Xcode中作为静态链接库构建。但是,调用它时定义的自定义函数会丢失。

例如,我加载了扩展名,没有错误。

SELECT load_extension('extension_name.so');

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

DB Error: 1 "no such function: custom_function"

有人知道将Sqlite扩展链接到Xcode项目吗?

3 个答案:

答案 0 :(得分:5)

正如@jbworld所说,你无法在iPhone上加载动态库,所以这个链接应该在编译时静态创建。在阅读spatialite的代码(这是一个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允许您静态链接扩展程序,则看起来如此。 The documentation似乎证实:

  

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

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

在加载任何sqlite DB之前调用此方法

希望这有帮助。

答案 1 :(得分:0)

您是否可以将自定义函数直接构建到主可执行文件中,并使用sqlite3_create_function告诉sqlite有关它们的信息?

我不知道在这种情况下适用的细节,但我记得iPhone在运行时加载代码很有趣。

答案 2 :(得分:0)

函数load_extension加载共享库(.so)。 iPhone上不允许这样做。您必须重新编译静态库以包含您要使用的扩展名。