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