(转)怎么在 Delphi 中静态链接 SQLite

(转)如何在 Delphi 中静态链接 SQLite如何在 Delphi 中静态链接 SQLite 搞了我几个小时,终于成功在 Delphi

(转)如何在 Delphi 中静态链接 SQLite

如何在 Delphi 中静态链接 SQLite

搞了我几个小时,终于成功在 Delphi 中静态链接了 SQLite (v3.5.4),下一步就是研究加密了,呵呵
中间其实遇到很多问题,今天累了,就不说了,改天补上

1.当然是下载 SQLite 的源代码啦,呵呵,不过记得要是 all in one 的 amalgamation 版本哦
? (修正: amalgamation 并非 all in one, 只是 core code all in one, 源代码里的其他文件也是不能少的!)
2.解压缩,得到3个文件 sqlite3.c sqlite3.h sqlite3ext.h
? 然后把 sqlite3.c 编译成 obj 以便在 Delphi 中使用
? 要注意的是不要用 VC 编译,要用 Borland 的 C++ 编译器,比如 Delphi 自带的 bcc
? 这主要是因为 VC 编译的 obj 是 COFF 格式的,而 Borland 用的 obj 是 OMF 格式
? bcc 编译的命令行: bcc32 -pc -RT- -O -w- -6 -I(bcc32)\include -c sqlite3.c
3.光有 sqlite3.obj 还不够哦,呵呵,因为 sqlite3.c 有链接其他的库
? 这里提供所有要用到的 obj 文件 下载
4.现在所有的 obj 文件都准备好了,不过别高兴的太早了,现在只完成了一小部分而已...
? 要在 Delphi 中使用这些 obj 中的函数,必须要先声明一下
? 先新建个 Unit, 比如 sqlite3.pas, 然后指定链接的 obj 文件,如
??? {$L 'OBJ\sqlite3_5_4.obj'}
??? {$L 'OBJ\streams.obj'} //duplicato
??? {$L 'OBJ\_ftoul.obj'}
??? {$L 'OBJ\files.obj'}
? 注意顺序哦,呵呵
? 然后添加函数声明
? 比如要用到 sqlite3_open 方法,在 sqlite 的源代码里声明是这样的
??? SQLITE_API int sqlite3_open(
????? const char *filename,?? /* Database filename (UTF-8) */
????? sqlite3 **ppDb????????? /* OUT: SQLite db handle */
??? );
? 在 Delphi 中相应的声明为:
??? function _sqlite3_open(dbname: PChar; var db: Pointer): Integer; cdecl; external;
? 注意调用方式为 cdecl, 函数名要以 _ 开头,否则会找不到
? 只是 sqlite3 函数好多哦,呵呵,所以我才说只完成了部分工作嘛...
5.OK,完成了函数声明才算是全部完成
? 现在可以正式使用了~
常见问题:
? 1.编译时报 Unsatisfied forward or external declaration
??? 出现这个错误的原因是声明的函数的找不到
??? 一般来说是因为链接的 obj 文件不全,或者顺序不对
??? 还有就是声明的函数名称不对,找不到
? 2.编译时报 Internal Error: L3576
??? 声明的函数参数不匹配