概述
“最新版GDAL源碼下載 ”一文中,我們為大家分享了最新版本的GDAL源碼,而GDAL是需要依賴PROJ投影轉換庫的。
因此,在最新版投影轉換工具PROJ源碼 ”一文中,我們又為大家分享了PROJ的源碼,如果你對PROJ源碼進行編譯,會發現它會需要SQLite的支持。
這里,我們再為大家分享SQLite的源碼下載與編譯的方法,你可以通過關注微信公眾號“水經注GIS”并回復“SQLite”獲取最新版本的SQLite源碼與基于VS2015的編譯工程文件。
什么是SQLite?
SQLite是一個進程庫,實現了一個自包含的,無服務器,零配置及事務性的SQL數據庫引擎。
SQLite的源代碼是公開的,因此可以免費用于任何目的,無論是否是商業目的。
SQLite是世界上部署最廣泛的數據庫,其應用程序數量超出我們的想象,其中包括Adobe公司、Airbus公司、FaceBook、微軟、蘋果和谷歌等世界知名企業,SQLite數據庫文件也是美國國會圖書館推薦的存儲格式。
SQLite是嵌入式SQL數據庫引擎,與大多數其他SQL數據庫不同,SQLite沒有單獨的服務器進程。
SQLite直接讀取和寫入普通磁盤文件,具有多個表、索引、觸發器和視圖的完整SQL數據庫包含在單個磁盤文件中。
數據庫文件格式是跨平臺的,因此可以在32位和64位系統之間或在big-endian和 little-endian 體系結構之間自由復制數據庫,這些功能使SQLite成為應用程序文件格式的流行選擇。
SQLite是一個緊湊的庫,啟用所有功能后,庫大小可以小于600KB,具體取決于目標平臺和編譯器優化的設置。
SQLite在內存越大的情況下運行速度就越快,即使在低內存環境下,性能通常也相當不錯,甚至可能會比直接通過系統I/O讀取更快。
如何下載最新版SQLite源碼
最新版本的SQLite源碼可以到官方網站下載,在官方網站的第一項下載鏈接即為源碼,如下圖所示。
SQLite官網
另外,還需要下載模塊定義文件sqlite3.def,否則無法生成sqlite3.lib庫,如下圖所示。
下載預編譯文件
為了便于使用,可以把源碼和預編譯文件的32位與64位版本都下載下來,如下圖所示。
源碼文件壓縮包
將文件進行解壓,根據實際需要,預編譯文件可以選擇32位或64位版本,最后將源碼文件匯總到一個目錄中備用,如下圖所示。
源碼文件
以上準備工作就緒之后,接下來就可以對源碼進行編輯了。
如何基于VS2015編譯SQLite源碼
我們基于VS2015對SQLite源碼進行編譯,如果你還沒有任何編譯工具,請參閱“Visual Studio 2015 安裝教程(附安裝包)”一文部署安裝編譯環境。
在VS2015中新建一個名為“sqlite3”的Win32項目,如下圖所示。
新建Win32項目
點擊下一步繼續,然后在應用程序設置中選擇“DLL”和“空項目”,如下圖所示。
應用程序設置
項目新建完成后,將之前準備的源碼文件復制到工程目錄,如下圖所示。
源代碼準備
通過添加現有項功能,將頭文件sqlite.h和sqlite3ext.h添加到工程中,如下圖所示。
導入源碼頭文件
另外,也需要將shell.c、sqlite3.c和sqlite3.def添加到源文件中,如下圖所示。
導入源碼完成
現在如果直接編譯工程,則不會生成sqlite3.lib庫文件,因此需要在項目屬性中設置sqlite3.def模塊定義文件,如下圖所示。
配置模塊定義文件
現在將源碼進行編輯之后,會生成許多錯誤提示:
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3_column_database_name
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3_column_database_name16
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3_column_origin_name
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3_column_origin_name16
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_column_table_name
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3_column_table_name16
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_deserialize
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3_fts3_may_be_corrupt
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3_fts5_may_be_corrupt
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_preupdate_count
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_preupdate_depth
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_preupdate_hook
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_preupdate_new
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_preupdate_old
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3_rtree_geometry_callback
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3_rtree_query_callback
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3_serialize
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changegroup_add
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3changegroup_add_strm
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changegroup_delete
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changegroup_new
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changegroup_output
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3changegroup_output_strm
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_Apply
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3changeset_apply_strm
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_apply_v2
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3changeset_apply_v2_strm
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_concat
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3changeset_concat_strm
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_conflict
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_finalize
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3changeset_fk_conflicts
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_invert
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3changeset_invert_strm
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_new
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_next
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_old
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_op
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_pk
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_start
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3changeset_start_strm
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3changeset_start_v2
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3changeset_start_v2_strm
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3rebaser_configure
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3rebaser_create
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3rebaser_delete
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3rebaser_rebase
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3rebaser_rebase_strm
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_attach
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_changeset
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3session_changeset_strm
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_config
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_create
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_delete
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_diff
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_enable
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_indirect
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_isempty
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3session_memory_used
1>sqlite3.def : error LNK2001: 無法解析的外部符號 sqlite3session_patchset
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3session_patchset_strm
1>sqlite3.def : error LNK2001: 無法解析的外部符號
sqlite3session_table_filter
生成錯誤的原因,是因為在sqlite3.def中定義的函數在源碼中默認沒有導出,需要在工程屬性中添加以下預處理定義,如下所示。
SQLITE_CORE
SQLITE_EXPORTS
SQLITE_ENABLE_FTS3
SQLITE_ENABLE_FTS5
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_ENABLE_SESSION
SQLITE_ENABLE_PREUPDATE_HOOK
SQLITE_ENABLE_DESERIALIZE
添加宏定義
只要上述配置正確,無論是在Debug還是Release版本下都可以編譯成功,如下圖所示。
編譯成功
編譯成功后,就可以在源碼工程的Debug或Release目錄中找到sqlite3.dll和sqlite3.lib文件,如下圖所示。
編譯結果
現在,我們將下載的源碼文件壓縮包,編譯成功的工程源碼整理到了一個目錄中,如下圖所示。
分享資料整理
為了方便分享,我們將上述整理好的文件打包上傳到了百度網盤中,請通過關注微信公眾號“水經注GIS”,然后在后臺回復“SQLite”可獲取下載地址。
總結
SQLite代碼庫由一支全職從事SQLite工作的國際開發人員團隊支持,以持續擴展SQLite的功能并增強其可靠性和性能,同時保持與已發布的接口規范,以及SQL語法和數據庫文件格式的向后兼容性。
最后,如果你在SQLite源碼編譯過程中遇到任何難題,請通過關注公眾號“水經注GIS”并在后臺留言告訴我們,我們將竭盡所能地為你提供幫助,從而將我們“為用戶提供豐富的地圖數據與專業的GIS服務”之宗旨落到實處!






