xerial/sqlite-jdbc驱动下SQLite扩展unionvtab/swarmvtab DLL加载报错问询
报错触发原因
该报错核心是扩展DLL与DBeaver运行环境不兼容,已经可以排除路径、DLL损坏类问题(同路径DLL可在sqlite3.exe中正常加载),具体触发点有两个:
- 架构不匹配:VS2019默认编译的DLL架构和启动的命令行架构一致,如果你编译的是x64版DLL,但DBeaver是32位版本/自带的SQLite JDBC驱动是32位,就会无法识别64位DLL,反之同理
- 运行时依赖缺失:默认编译的DLL用的是动态VC运行时,如果DBeaver运行环境中没有对应版本的VC++可再发行组件包,DLL加载时依赖项解析失败,就会被判定为无效Win32程序
解决步骤
- 确认DBeaver的运行架构
打开DBeaver,点击帮助 > 关于DBeaver > 安装细节 > 配置,查找os.arch参数:
- 如果值为
x86,说明DBeaver是32位,需要编译32位版本的扩展DLL - 如果值为
amd64,说明DBeaver是64位,需要编译64位版本的扩展DLL
- 编译对应架构的DLL
重新打开对应架构的VS2019开发者命令行,执行原编译命令即可:
- 编译32位:打开「x86 Native Tools Command Prompt for VS 2019」执行命令
- 编译64位:打开「x64 Native Tools Command Prompt for VS 2019」执行命令
- 可选:消除运行库依赖
如果不想额外安装VC运行库,可以在编译参数中添加静态运行时标识,把运行库直接打包进DLL:
cl /MT unionvtab.c /link /dll /out:unionvtab.dll
- 验证加载
重启DBeaver后重新执行SELECT load_extension('你的DLL全路径')即可正常加载。
内容的提问来源于stack exchange,提问作者Pepik
相关产品推荐
相关产品推荐

