小巧、快速、可靠
任選三種
SQLite Amalgamation

1. 執行摘要

超過 100 個獨立的原始碼檔案串接成一個名為「sqlite3.c」的單一大型 C 程式碼檔案,稱為「amalgamation」。amalgamation 包含應用程式嵌入 SQLite 所需的一切。

將所有 SQLite 程式碼合併成一個大型檔案,讓 SQLite 更容易部署,只需追蹤一個檔案即可。由於所有程式碼都在單一轉譯單元中,因此編譯器可以執行更好的跨程序和內嵌最佳化,產生的機器碼速度提升 5% 到 10%。

2. SQLite Amalgamation

SQLite 函式庫包含 111 個核心 C 程式碼檔案(截至 版本 3.37.0 - 2021-11-27),以及 22 個額外檔案,用於實作某些常用的擴充功能。在 133 個主要原始碼檔案中,約 75% 是 C 程式碼,約 25% 是 C 標頭檔。大多數這些檔案在於儲存在 SQLite 版本控制系統 中,並在一般文字編輯器中手動編輯,因此是「原始碼」檔案。但有些 C 語言檔案是使用腳本或輔助程式產生的。例如,parse.y 檔案包含 SQL 語言的 LALR(1) 文法,由 Lemon 剖析器產生器 編譯,產生檔案「parse.c」中的剖析器,並附有「parse.h」中的標記識別碼。

SQLite 的 makefile 有個「sqlite3.c」目標,用來建置合併檔,包含核心 SQLite 函式庫的所有 C 程式碼,以及 FTS3FTS5RTREEDBSTATJSON1RBUSESSION 擴充功能。此檔案包含約 238K 行程式碼(或在省略空白行和註解後為 145K),大小超過 8.4 MB(截至 2021-12-29)。

儘管各種擴充功能都包含在「sqlite3.c」合併檔中,但它們會使用 #ifdef 陳述式停用。使用 編譯時期選項 來啟用擴充功能,例如

合併檔包含整合 SQLite 到較大專案所需的一切。只要將合併檔複製到您的原始碼目錄,並與專案中的其他 C 程式碼檔案一起編譯即可。(更詳細的討論編譯程序。)您可能還想使用定義 SQLite 程式設計 API 的「sqlite3.h」標頭檔。sqlite3.h 標頭檔可單獨取得。sqlite3.h 檔案也包含在合併檔中,位於前幾千行。因此,如果您有 sqlite3.c 的副本,但似乎找不到 sqlite3.h,您隨時可以從合併檔中複製並貼上來重新產生 sqlite3.h。

除了讓 SQLite 更容易整合到其他專案中之外,合併檔還能讓它執行得更快。許多編譯器能夠對包含在單一轉譯單元(如合併檔中)的程式碼進行額外的最佳化。當我們使用合併檔來編譯 SQLite 而不是個別原始碼檔案時,我們測量到效能提升了 5% 到 10%。缺點是,額外的最佳化通常會以函式內嵌的形式進行,這往往會使產生的二進位元映像檔案變大。

3. 分割合併檔

開發人員有時會遇到除錯四分之一百萬行合併原始檔的問題,因為某些除錯器只能處理小於 32,768 的原始碼行號。合併原始碼執行良好。只是無法在除錯器中逐行執行。

為了迴避此限制,合併也以分割形式提供,包含「sqlite3-1.c」、「sqlite3-2.c」等檔案,其中每個檔案都小於 32,768 行,而檔案的串接包含完整合併的所有程式碼。然後有一個名為「sqlite3-all.c」的獨立原始檔,基本上包含類似這樣的程式碼

#include "sqlite3-1.c"
#include "sqlite3-2.c"
#include "sqlite3-3.c"
#include "sqlite3-4.c"
#include "sqlite3-5.c"
#include "sqlite3-6.c"
#include "sqlite3-7.c"

使用分割合併的應用程式只需針對「sqlite3-all.c」編譯,而非「sqlite3.c」。這兩個檔案運作方式完全相同。但使用「sqlite3-all.c」時,沒有任何單一原始檔包含超過 32,767 行的程式碼,因此使用某些除錯器會更方便。分割合併的缺點是它包含 6 個 C 原始碼檔案,而並非只有 1 個。

4. 下載預先編譯合併的副本

合併和 sqlite3.h 標頭檔案可在 下載頁面 上取得,檔案名稱為 sqlite-amalgamation-X.zip,其中 X 會替換為適當的版本號碼。

5. 從正規原始碼建置合併

若要建置合併(完整合併或分割合併),請先從三個伺服器之一 取得正規原始碼。然後,在類 Unix 系統和已安裝免費 MinGW 開發環境的 Windows 系統上,可以使用下列指令建置合併

sh configure
make sqlite3.c

若要使用 Microsoft Visual C++ 建置,請執行此指令

nmake /f makefile.msc sqlite3.c

在兩種情況下,都可以透過將「sqlite3-all.c」替換為「sqlite3.c」作為 make 目標,來取得分割合併。

5.1. 相依性

建置過程廣泛使用 Tcl 程式語言。您需要安裝 Tcl 的副本才能讓上述 make 目標運作。易於使用的安裝程式可從 http://www.tcl-lang.org/ 取得。許多 unix 工作站預設安裝 Tcl。

5.2. 另請參閱

可以在 如何編譯 SQLite 頁面找到編譯 SQLite 的其他說明。

此頁面最後修改於 2023-08-03 14:10:55 UTC