extension-function.c本身不支持windows下编译,如果在windows下编译,需要对官方文件进行修改
1. 修改extension-function.
将官方文件的(1837行)
#ifdef COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE
int sqlite3_extension_init(
sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi){
SQLITE_EXTENSION_INIT2(pApi);
RegisterExtensionFunctions(db);
return 0;
}
#endif /* COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE */
替换为
#ifdef COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE
#ifdef _WIN32
__declspec(dllexport)
#endif
int sqlite3_extension_init(
sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi){
SQLITE_EXTENSION_INIT2(pApi);
RegisterExtensionFunctions(db);
return 0;
}
#endif /* COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE */
2.编译dll
使用visual studio 32位本机命令行工具执行 cl extension-functions.c -link -dll -out:sqlite3_ext_func32.dll
或
使用visual studio 64位本机命令行工具执行 cl extension-functions.c -link -dll -out:sqlite3_ext_func64.dll
3.调用
//打开数据库
sqlite3 *db;
sqlite3_open("xxx", &db);
//允许sqlite加载扩展
sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION , 1, NULL);
//加载扩展
int ret = sqlite3_load_extension(db, "sqlite3_ext_func64.dll", 0, 0);
if (ret != SQLITE_OK)
OutputDebugString(_T("sqlite3_load_extension:sqlite3_ext_func64.dll fail!\n"));