文件說(shuō)明
下載源碼包兩個(gè):
sqlite-dll-win32-x86-3081101.zip,里面提供了導(dǎo)出sqlite3的函數(shù)的文件sqlite3.def
主要用于生成LIB文件,確定鏈接使用
sqlite-preprocessed-3081101.zip,提供了源碼文件,但是刪除shell.c和tclsqlite3.c文件
shell.c:提供了main函數(shù)入口,可生成sqlite.exe的可執(zhí)行程序,生成的控制臺(tái)操作SQLite數(shù)據(jù)庫(kù)
tclsqlite.c:提供了在Linux系統(tǒng)下,進(jìn)行測(cè)試SQLite的TCL腳本
?
這兩個(gè)文件對(duì)于編譯環(huán)境是windows,只是將SQLite編譯進(jìn)程序中都不需要,添加源代碼的時(shí)候,需要進(jìn)行剔除。
sqlite3.h:提供了對(duì)外使用的所有接口
sqlite3ext.h:該文件暫時(shí)不了解
** This header file defines the SQLiteinterface for use by
** shared libraries that want to beimported as extensions into
** an SQLite instance.? Shared libraries that intend to be loaded
** as extensions by SQLite should #includethis file instead of
** sqlite3.h.
2 編譯選項(xiàng)說(shuō)明
必選編譯選項(xiàng):
SQLITE_CORE
FTS1有一個(gè)設(shè)計(jì)的缺陷,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)錯(cuò)誤(databasecorruption).強(qiáng)烈推薦廢棄該模塊,改用fts3或者更高的模塊。如果你相信fts1的使用是安全的,可以通過(guò)添加DSQLITE_ENABLE_BROKEN_FTS1=1到編譯選項(xiàng)。
FTS1模塊將會(huì)作為一個(gè)擴(kuò)展模塊而被編譯(當(dāng)SQLITE_CORE沒(méi)有被定義的情況下)。
另外如果SQLITE_ENABLE_FTS1被定義,F(xiàn)TS1也會(huì)被編譯進(jìn)SQLite內(nèi)核。
?
可選編譯選項(xiàng):
SQLITE_ENABLE_RTREE
將Rtree模塊編譯進(jìn)SQLite內(nèi)核,本研究針對(duì)二維空間的POI進(jìn)行存儲(chǔ),
所以必須開(kāi)啟Rtree模塊,稍后會(huì)進(jìn)行源碼剖析。
?
?
SQLITE_ENABLE_COLUMN_METADATA
作用:可以調(diào)用如下的函數(shù)
SQLITE_API const char *SQLITE_STDCALL sqlite3_column_database_name(sqlite3_stmt*,int);
SQLITE_API
const void *SQLITE_STDCALL sqlite3_column_database_name16(sqlite3_stmt*,int);
SQLITE_API const
char *SQLITE_STDCALL sqlite3_column_table_name(sqlite3_stmt*,int);
SQLITE_API const void
*SQLITE_STDCALL sqlite3_column_table_name16(sqlite3_stmt*,int);
SQLITE_API const char
*SQLITE_STDCALL sqlite3_column_origin_name(sqlite3_stmt*,int);
SQLITE_API const void
*SQLITE_STDCALL sqlite3_column_origin_name16(sqlite3_stmt*,int);
這些函數(shù)主要是獲取數(shù)據(jù)庫(kù)的庫(kù)名,表名,列名
調(diào)用條件:必須在[sqlite3_step()]之后,[sqlite3_finalize()]之前調(diào)用。
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括貴溪網(wǎng)站建設(shè)、貴溪網(wǎng)站制作、貴溪網(wǎng)頁(yè)制作以及貴溪網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,貴溪網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到貴溪省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!
1.新建win32控制臺(tái)程序,名稱(chēng)sqlite3
?
2.選擇生成DLL
?
3.解壓壓縮包,將sqlite-preprocessed-3081101的文件復(fù)制到工程文件夾下(除了shell.c以及tclsqlite.c)。
?
4.通過(guò)添加存在文件,將源碼添加到編譯項(xiàng)目中
?
5設(shè)置模塊定義文件sqlite3.def,否則生成的dll沒(méi)有對(duì)應(yīng)的lib
指定函數(shù)的導(dǎo)出文件:sqlite3.defs
屬性>>鏈接器>>輸入>>模塊定義文件(sqlite3.def),請(qǐng)注意這種情況下,sqlite3.def文件和編譯環(huán)境平級(jí)。
?
6.添加預(yù)定義選項(xiàng)SQLITE_CORE,SQLITE_ENABLE_COLUMN_METADATA、SQLITE_ENABLE_RTREE,這是sqlite3的宏定義。
屬性>>C/C++>>預(yù)處理器>>預(yù)處理定義>>
SQLITE_CORE
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_ENABLE_RTREE
編譯出錯(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_rtree_geometry_callback
1>sqlite3.def :error LNK2001: 無(wú)法解析的外部符號(hào)sqlite3_rtree_query_callback
前面6個(gè)函數(shù),必須定義了SQLITE_ENABLE_COLUMN_METADATA才能夠?qū)⒑瘮?shù)導(dǎo)出,一般情況下,這些函數(shù),我們可以直接在sqlite3.def文件中刪除,不導(dǎo)出
后面2個(gè)函數(shù),必須定義了SQLITE_ENABLE_RTREE才能夠?qū)⒑瘮?shù)導(dǎo)出,如果我們不適用R樹(shù)的空間搜索功能,這些函數(shù),我們可以直接在sqlite3.def文件中刪除,不導(dǎo)出
7.按F7生成相應(yīng)的dll和lib。
編譯說(shuō)明
1)fts2 has a designflaw and has been deprecated
2)fts1 has a designflaw and has been deprecated
解決方案:
解析:FTS1和FTS2都有設(shè)計(jì)的缺陷,現(xiàn)在已經(jīng)被廢棄,目前已經(jīng)提供了FTS3或者FTS4,這些作為全文搜索的模塊,彌補(bǔ)了以前的FTS1的不足。如果確定不會(huì)使用到全文搜索,可以直接使用SQLITE_CORE,禁用。將SQLITE_CORE添加到編譯選項(xiàng)。
VS 的基本設(shè)置:屬性>>C/C++>>預(yù)處理器》》預(yù)處理定義
3)Cannot open includefile: 'unicode/utypes.h': No such file or directory??
該問(wèn)題主要是調(diào)用了FTS1或者FTS2引起的,通過(guò)禁用FTS1和FTS2順利編譯通過(guò)。
FTS1有一個(gè)設(shè)計(jì)的缺陷,會(huì)導(dǎo)致數(shù)據(jù)庫(kù)錯(cuò)誤(databasecorruption).強(qiáng)烈推薦廢棄該模塊,改用fts3或者更高的模塊。如果你相信fts1的使用是安全的,可以通過(guò)添加DSQLITE_ENABLE_BROKEN_FTS1=1到編譯選項(xiàng)。
FTS1模塊將會(huì)作為一個(gè)擴(kuò)展模塊而被編譯(當(dāng)SQLITE_CORE沒(méi)有被定義的情況下)。
另外如果SQLITE_ENABLE_FTS1被定義,F(xiàn)TS1也會(huì)被編譯進(jìn)SQLite內(nèi)核。
4)Error: no module:rtree
默認(rèn)情況下sqlite3.exe的控制臺(tái)程序是沒(méi)有攜帶Rtree模塊的,如果需要啟用該模塊,需要調(diào)用預(yù)編譯定義:SQLITE_ENABLE_RTREE,然后通過(guò)shell.c文件的main重新生成程序。
5)控制臺(tái)程序
建立空的控制臺(tái),然后導(dǎo)入sqlite源碼,編譯出現(xiàn)如下的錯(cuò)誤:
error LNK2019: 無(wú)法解析的外部符號(hào)_WinMain@16,該符號(hào)在函數(shù) ___tmainCR...
第一步:在C++/預(yù)編譯中,添加:SQLITE_ENABLE_RTREE 參數(shù)支持rtree
第二步:如果是控制臺(tái)程序:
1.菜單中選擇Project->Properties, 彈出Property Pages窗口
2.在左邊欄中依次選擇:ConfigurationProperties->C/C++->Preprocessor,然后在右邊欄的PreprocessorDefinitions對(duì)應(yīng)的項(xiàng)中刪除_WINDOWS, 添加_CONSOLE.
3.在左邊欄中依次選擇:ConfigurationProperties->Linker->System,然后在右邊欄的SubSystem對(duì)應(yīng)的項(xiàng)改為CONSOLE(/SUBSYSTEM:CONSOLE)
6)unexpected end offile while looking for precompiled header. Did you forget to add '#include"stdafx.h"' to your source?
SQLite源碼不能夠調(diào)用預(yù)編譯處理,因?yàn)镾QLite的源碼是純C語(yǔ)言,無(wú)法獲得VC++預(yù)編譯的好處。
解決:屬性 >> C/C++ >> 預(yù)編譯頭 >> 創(chuàng)建、使用預(yù)編譯頭(不使用預(yù)編譯頭)