您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關如何進行SQLite編譯,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
上周,我一直在做一個 SQL 網站。我使用 sqlite 運行網站上的所有查詢,并且我想在其中一個例子(這個)中使用窗口函數。
但是我使用的是 Ubuntu 18.04 中的 sqlite 版本,它太舊了,不支持窗口函數。所以我需要升級 sqlite!
事實證明,這個過程超麻煩(如通常一樣),但是非常有趣!我想起了一些有關可執行文件和共享庫如何工作的信息,結論令人滿意。所以我想在這里寫下來。
SQLite 的下載頁面有一個用于 Linux 的 SQLite 命令行工具的二進制文件的鏈接。我下載了它,它可以在筆記本電腦上運行,我以為這就完成了。
但是后來我嘗試在構建服務器(Netlify) 上運行它,得到了這個極其奇怪的錯誤消息:“File not found”。我進行了追蹤,并確定 execve
返回錯誤代碼 ENOENT,這意味著 “File not found”。這有點令人發狂,因為該文件確實存在,并且有正確的權限。
我搜索了這個問題(通過搜索 “execve enoen”),找到了這個 stackoverflow 中的答案,它指出要運行二進制文件,你不僅需要二進制文件存在!你還需要它的加載程序才能存在。(加載程序的路徑在二進制文件內部)
要查看加載程序的路徑,可以使用 ldd
,如下所示:
$ ldd sqlite3 linux-gate.so.1 (0xf7f9d000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7f70000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7e6e000) libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf7e4f000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7c73000) /lib/ld-linux.so.2
所以 /lib/ld-linux.so.2
是加載程序,而該文件在構建服務器上不存在,可能是因為 Xenial(Xenial 是 Ubuntu 16.04,本文應該使用的是 18.04 “Bionic Beaver”)安裝程序不支持 32 位二進制文件(?),因此我需要嘗試一些不同的東西。
好吧,我想我也許可以安裝來自 debian testing 的 sqlite 軟件包。嘗試從另一個我不使用的 Debian 版本安裝軟件包并不是一個好主意,但是出于某種原因,我還是決定嘗試一下。
這次毫不意外地破壞了我計算機上的 sqlite(這也破壞了 git),但我設法通過 sudo dpkg --purge --force-all libsqlite3-0
恢復了,并使所有依賴于 sqlite 的軟件再次工作。
我還嘗試僅從 Debian sqlite 軟件包中提取 sqlite3 二進制文件并運行它。毫不意外,這也行不通,但這個更容易理解:我有舊版本的 libreadline(.so.7
),但它需要 .so.8
。
$ ./usr/bin/sqlite3./usr/bin/sqlite3: error while loading shared libraries: libreadline.so.8: cannot open shared object file: No such file or directory
我花費這么多時間嘗試下載 sqlite 二進制的原因是我認為從源代碼編譯 sqlite 既煩人又耗時。但是顯然,下載隨便一個 sqlite 二進制文件根本不適合我,因此我最終決定嘗試自己編譯它。
這有指導:如何編譯 SQLite。它是宇宙中最簡單的東西。通常,編譯的感覺是類似這樣的:
運行 ./configure
意識到我缺少依賴
再次運行 ./configure
運行 make
編譯失敗,因為我安裝了錯誤版本的依賴
去做其他事,之后找到二進制文件
編譯 SQLite 的方式如下:
從下載頁面下載整合的 tarball
運行 gcc shell.c sqlite3.c -lpthread -ldl
完成!!!
所有代碼都在一個文件(sqlite.c
)中,并且沒有奇怪的依賴項!太奇妙了。
對我而言,我實際上并不需要線程支持或 readline 支持,因此我用編譯頁面上的說明來創建了一個非常簡單的二進制文件,它僅使用了 libc 而沒有其他共享庫。
$ ldd sqlite3 linux-vdso.so.1 (0x00007ffe8e7e9000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbea4988000) /lib64/ld-linux-x86-64.so.2 (0x00007fbea4d79000)
我認為 SQLite 的構建過程如此簡單很酷,因為過去我很樂于編輯 sqlite 的源碼來了解其 B 樹的實現方式。
鑒于我對 SQLite 的了解,這并不令人感到意外(它在受限環境/嵌入式中確實可以很好地工作,因此可以以一種非常簡單/最小的方式進行編譯是有意義的)。
上述就是小編為大家分享的如何進行SQLite編譯了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。