我在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项目吗?
答案 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)
来启动并运行扩展。
希望这有帮助。
答案 1 :(得分:0)
您是否可以将自定义函数直接构建到主可执行文件中,并使用sqlite3_create_function告诉sqlite有关它们的信息?
我不知道在这种情况下适用的细节,但我记得iPhone在运行时加载代码很有趣。
答案 2 :(得分:0)
函数load_extension加载共享库(.so)。 iPhone上不允许这样做。您必须重新编译静态库以包含您要使用的扩展名。