首先,sqlite 官方已經有先行編譯好的DLL下載,如果你不需要特別最佳化的版本,直接下載官網上的DLL即可。你可以在下載 頁面的 “Precompiled Binaries For Windows” 可以找到。
不過你想編譯出自己的版本,比如添加最佳化參數後編譯,debug版,或進行一些定製(例如官網這裡 有一些先行編譯宏,允許你定製自己的sqlite),那麼你就需要自己編譯了。
首先在下載原始碼,在頁面的第一行就是,如 sqlite-amalgamation-3_6_12.zip ,接著下載編譯好的DLL,我們主要是需要這裡面的一個 sqlite3.def 檔案,因為原始碼裡沒有。一般下拉到 “Precompiled Binaries For Windows” 就可以看到,例如 sqlitedll-3_6_12.zip 。有了這兩個壓縮包就可以了。
首 先解壓 sqlite-amalgamation-3_6_12.zip 到檔案夾 sqlite3/,會得到
sqlite3.c,sqlite3.h,sqlite3ext.h 三個檔案,然後解壓 sqlitedll-3_6_12.zip ,把
sqlite3.def 移動到 sqlite3/ 下面。
開啟 visual studio,建立一個空的dll工程,工程名為sqlite3,這樣是為了能直接產生名為sqlite3.dll 的dll。然後sqlite3/ 下的4個檔案檔案夾移動到此工程目錄下,即與 sqlite3.vcproj 在同一級。
將 sqlite3.c 添加到工程,具體做法是右擊“源檔案”,選擇“添加->現有項”,瀏覽到sqlite3.c即可。如所示。
然後將sqlite3.def 添加到工程,然後輸入給連接器。具體做法是右擊工程sqlite3,選擇“屬性”,在彈出的對話方塊中選擇“連接器->輸入”,在“模組定義檔案”中輸入sqlite3.def,如所示。
好,可以開始編譯了,右擊sqlite3,選擇“產生”,結果連結出錯,
—— 已啟動產生: 項目: sqlite3, 配置: Release Win32 ——
正在編譯…
sqlite3.c
正在連結…
sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_column_database_name
sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_column_database_name16
sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_column_origin_name
sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_column_origin_name16
sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_column_table_name
sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_column_table_name16
sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_table_column_metadata
看來sqlite3.def 中定義的這幾個匯出函數找不到定義,什麼原因呢,經過一番google,找到這篇文章 ,需要增加一個預定義宏 SQLITE_ENABLE_COLUMN_METADATA,這個宏是什麼意思呢,到官網 去查一下,
SQLITE_ENABLE_COLUMN_METADATA
When this C-preprocessor macro is defined, SQLite includes some
additional APIs that provide convenient access to meta-data about
tables and queries. The APIs that are enabled by this option are:
* sqlite3_column_database_name()
* sqlite3_column_database_name16()
* sqlite3_column_table_name()
* sqlite3_column_table_name16()
* sqlite3_column_origin_name()
* sqlite3_column_origin_name16()
* sqlite3_table_column_metadata()
原來是只有當啟用了這個宏後,c代碼中才會後這幾個函數的定義,OK,在前置處理器中添加 SQLITE_ENABLE_COLUMN_METADATA,如所示。
再來編譯,搞定!
查看原文