標籤:style blog http io ar 使用 sp for on
搞了我幾個小時,終於成功在 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
聲明的函數參數不匹配
如何在 Delphi 中靜態連結 SQLite