Skip to content

sqlite3.def 模块定义文件

Windows平台 模块定义文件(Module‑Definition File),纯文本文件,运行程序完全不需要它,只用于C/C++开发编译阶段。 官方dll压缩包 sqlite‑dll‑win64‑x64‑xxx.zip 里面只有两个文件:

  • sqlite3.dll:真正运行时动态库
  • sqlite3.def:导出函数列表文本文件

打开 sqlite3.def,可以看到内容格式:

LIBRARY sqlite3.dll
EXPORTS
sqlite3_aggregate_context
sqlite3_aggregate_count
sqlite3_bind_blob
sqlite3_bind_double
......

作用:列出 dll 对外暴露的全部 C API 导出函数名。

核心用途

用来生成导入库 sqlite3.lib。 C/C++ VS开发,隐式链接sqlite3.dll的时候,编译需要 .lib 文件;官网不直接提供lib,要用 def 生成。

VS开发人员命令提示符生成 lib

打开 x64 Native Tools Command Prompt for VS,进入文件目录执行:

cmd
lib /def:sqlite3.def /machine:x64 /out:sqlite3.lib

执行完成输出两个文件:

  • sqlite3.lib导入库(很小,几十KB,不是静态库),编译链接用
  • sqlite3.exp:导出辅助文件,一般可以删掉

注意:这个 sqlite3.lib 只是导入库,不是把sqlite代码打包进exe;程序运行依旧必须携带 sqlite3.dll

MinGW 环境

cmd
dlltool --def sqlite3.def --dllname sqlite3.dll --output-lib sqlite3.a

只有dll,丢失def怎么办

用 VS dumpbin 从 dll 反向导出 def 文件:

cmd
dumpbin /exports sqlite3.dll > sqlite3.def

手动简单修整格式后,就可以继续用lib命令生成lib。

哪些场景你完全不需要 sqlite3.def

  1. 使用 sqlite3.exe 命令行工具;
  2. Rust rusqlite(bundled模式内置编译sqlite源码,不依赖dll;系统模式会加载dll,但rust工具链不需要def);
  3. Python ctypes、C# P/Invoke,运行时LoadLibrary动态加载dll,不需要def/lib文件;
  4. 直接复制db文件、使用 sqlite3_rsync、sqldiff、sqlite3_analyzer 全套工具;

✅ 简单记:只有写C/C++原生程序,隐式链接sqlite3.dll的时候才碰sqlite3.def;普通使用SQLite完全不用管这个文件

SQLite Windows官方包全部文件总览

  1. sqlite‑tools‑win64‑x64.zip(工具包)
    • sqlite3.exe:交互终端
    • sqlite3_rsync.exe:快照备份
    • sqldiff.exe:库差异对比
    • sqlite3_analyzer.exe:存储分析
  2. sqlite‑dll‑win64‑x64.zip(动态库包)
    • sqlite3.dll:动态库
    • sqlite3.def:模块定义文件(开发编译用)
  3. sqlite‑amalgamation‑xxx.zip(源码包)
    • sqlite3.c、sqlite3.h:合并版源码,可以直接静态编译进程序。

rusqlite 的 features = ["bundled"] 就是内部使用 sqlite3.c 源码编译,不需要 dll、def、lib 任何文件